题目抽象:给出R=C(m,3)个队伍之间的胜率。给出需要挑战的n个队伍(按顺序)。玩家最开始从R个队伍中任选一支队伍去挑战,当挑战某队伍成功时,可以将当前的队伍与挑战成功的队伍交换,也可以继续选择该队伍。 求最大的胜率。
思路:物理递推法。
/* dp[i+1][j]
dp[i][j]=
dp[i+1][num[i]]
*/
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 const int MS=12; 6 const int CMS=122; 7 const int MAXN=10002; 8 9 // dp[i][j] 当前队伍为j,挑战队伍i的最大的胜率 10 double dp[MAXN][CMS]; 11 double p[CMS][CMS]; 12 int num[MAXN]; 13 14 int main() 15 { 16 int i,j,n,m,cnt; 17 while(scanf("%d",&n)!=EOF) 18 { 19 for(cnt=1,i=n;i>=(n-3+1);i--) 20 cnt*=i; 21 cnt/=6; 22 for(int i=0;i<cnt;i++) 23 for(int j=0;j<cnt;j++) 24 scanf("%lf",&p[i][j]); 25 scanf("%d",&m); 26 for(int i=1;i<=m;i++) 27 scanf("%d",&num[i]); 28 for(int i=0;i<=cnt;i++) 29 dp[m+1][i]=1.0; 30 for(int i=m;i>0;i--) 31 { 32 for(j=0;j<cnt;j++) 33 { 34 // 充分理解物理过程。 35 dp[i][j]=p[j][num[i]]*max(dp[i+1][j],dp[i+1][num[i]]); 36 } 37 } 38 double ans=-1.0; 39 for(j=0;j<cnt;j++) 40 if(ans<dp[1][j]) 41 ans=dp[1][j]; 42 printf("%.6lf\n",ans); 43 } 44 return 0; 45 }
时间: 2024-09-27 04:34:33