1 归根结底是DP问题,利用概率的知识写出状态转移方程,依然是确定两件事:
①分阶段(第一维)
②递推方向(倒推还是正推)和递推边界
2 double 用scanf输入时必须用%lf 。
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
double dp[7+1][256+1];
double p[256+1][256+1];
int total;
const double eps=1e-8;
int bottom;
int top;
int n;
void Find(int k,int x){
int t1=((x-1)/(1<<k))+1;
if(t1%2==0) t1--;
else t1++;
t1--;
bottom=(1<<k)*t1+1;
top=(1<<k)*(t1+1);
}
void Donggui(){
for(int k=2;k<=n;k++){
for(int i=1;i<=total;i++){
dp[k][i]=0;
Find(k-1,i);
for(int j=bottom;j<=top;j++){
dp[k][i]+=dp[k-1][i]*dp[k-1][j]*p[i][j];
}
}
}
}
int main()
{
while(~scanf("%d",&n)){
if(n==-1){
break;
}
total=(1<<n);
for(int i=1;i<=total;i++){
for(int j=1;j<=total;j++){
scanf("%lf",&p[i][j]);
}
}
for(int j,i=1;i<=total;i++){
if(i%2==0) j=i-1;
else j=i+1;
dp[1][i]=p[i][j];
}
Donggui();
int ans=-1;
double minn=0.0;
for(int i=1;i<=total;i++){
if((dp[n][i]-minn)>eps){
minn=dp[n][i];
ans=i;
}
}
cout<<ans<<endl;
}
}