转载请注明出处:http://blog.csdn.net/u010734277
给出一个矩阵,说明两个队伍之间打架时胜利的概率,然后给出AI所用的队伍,要求求出玩家可以获胜的最大概率。
我的方法是将概率矩阵存放在二维数组Matrix中,将电脑所用的队伍存放在数组AI中。
动态规划方程是dp(j,k)=max{dp(j,k),dp(p,k-1)*Matrix(p,AI(k))};dp(j,k)表示在打完第k层以后,玩家所拥有的队伍为j。当然还要进行一些处理,保证dp(j,k)一定存在,保证dp(p,k-1)存在。
代码如下:
#include<iostream>
#include<iomanip>
using namespace std;
double Matrix[125][125];
int AI[10005];
double dp[125][10005];
int main(){
ios::sync_with_stdio(false);
// freopen("data.txt","r",stdin);
int M;
while(cin>>M){
int R=M*(M-1)*(M-2)/6;
for(int i=0;i<R;++i){
for(int j=0;j<R;++j)
cin>>Matrix[i][j];
}
int N;
cin>>N;
for(int i=0;i<N;++i)cin>>AI[i];
double ans=0;
for(int i=0;i<R;++i){
for(int j=0;j<R;++j){
for(int k=0;k<N;++k){
dp[j][k]=-1;
}
}
dp[i][0]=dp[AI[0]][0]=Matrix[i][AI[0]];
for(int k=1;k<N;++k){
for(int j=0;j<R;++j){
if(dp[j][k-1]==-1&&AI[k]!=j)continue;
if(dp[j][k-1]!=-1){
dp[j][k]=dp[j][k-1]*Matrix[j][AI[k]];
// cout<<i<<' '<<j<<' '<<k<<' '<<dp[j][k]<<' '<<dp[j][k-1]<<endl;
}
if(AI[k]==j){
for(int p=0;p<R;++p){
if(dp[p][k-1]==-1)continue;
// cout<<"predp = "<<dp[j][k]<<endl;
dp[j][k]=max(dp[j][k],dp[p][k-1]*Matrix[p][AI[k]]);
// cout<<i<<' '<<j<<' '<<k<<' '<<dp[j][k]<<' '<<dp[p][k-1]<<' '<<"p="<<p<<' '<<AI[k]<<endl;
// cout<<endl;
}
}
}
}//for k
for(int i=0;i<R;++i){
ans=max(ans,dp[i][N-1]);
}
}
cout<<setiosflags(ios::fixed)<<setprecision(6)<<ans<<endl;
}
return 0;
}