景馳無人駕駛 1024 編程邀請賽 E題 (被大佬智商碾壓的)DP

對於每個合法串,都有不少種方案,咱們不妨把這些方案記爲,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 }
View Code
相關文章
相關標籤/搜索