對於每個合法串,都有不少種方案,咱們不妨把這些方案記爲,f1,f2,f3……fxc++
p = (f1+f2+f3+……+fk)*(f1+f2+f3+……+fk);ide
把他展開是否是很簡單!!!可是我怎麼就想不到!!!spa
展開以後 再來看,是兩個 fi * fj 的和code
這兩個fi和fj的方案相同,那麼 能夠把他當作兩我的,兩我的分別走,而且他們序列相同的機率。blog
dp[i][j][k] 第i秒,第一我的走在j位置,第二我的走在k位置。ci
1 #include <bits/stdc++.h> 2 const long long mod = 1e9+7; 3 const double ex = 1e-10; 4 #define inf 0x3f3f3f3f 5 using namespace std; 6 int ran[60]; 7 double p[60][60]; 8 double dp[35][60][60]; 9 int main() 10 { 11 int T; 12 scanf("%d",&T); 13 while (T--){ 14 int n,m; 15 scanf("%d%d",&n,&m); 16 for (int i = 1; i<=n; i++){ 17 for (int j = 1; j <=n; j++){ 18 cin >> p[i][j]; 19 } 20 } 21 int z; 22 scanf("%d",&z); 23 for (int i = 1; i<=n;i++){ 24 scanf("%d",&ran[i]); 25 } 26 dp[1][1][1] = 1; 27 for (int i = 2; i<=m ;i++){ 28 for (int j = 1; j <=n ;j++){ 29 for (int k = 1; k <=n ;k++){ 30 dp[i][j][k] = 0; 31 if (ran[j]!=ran[k]) continue; 32 for (int frj = 1; frj <=n ; frj++){ 33 if (abs(ran[j] - ran[frj]) > 2) continue; 34 for (int frk = 1; frk <=n ; frk++){ 35 dp[i][j][k] += dp[i-1][frj][frk]*p[frj][j]*p[frk][k]; 36 } 37 } 38 } 39 } 40 } 41 double ans = 0; 42 for (int i = 1; i<=n; i++) 43 for (int j = 1; j <=n; j++) 44 ans += dp[m][i][j]; 45 printf("%.18f\n",ans); 46 } 47 return 0; 48 }