给定一个矩阵a[i][j]是i战胜j的概率
第一回合只能是临近的比赛12 34,给定的n是偶数(2 4 8 16 32 64)
第二回合是第一回合胜利的在比赛
最后决出一个人
问你1是最后胜利者的概率是多少。。。
看的大神的代码
用的尺取法+dp
include
include
include
include
/*这道题的精髓是尺取法,
我开始想dp的时候,像个傻逼一样,特别傻逼的dp方法
dp[i][j]是i到j这个范围内时 i为霸主的价值。
看了大佬的dp,兼职是鬼斧神工。
*/
const int maxn=110;
using namespace std;
double dp[maxn][maxn];
double a[maxn][maxn];
int main()
{ int t;
int n;
int TT,TTT;
cin>>t;
while(t--)
{ cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
memset(dp,0,sizeof(dp));
int cnt=0;
for(int i=1;i<=n;i++)
dp[i][0]=1.0;
//int l=0,ll=0,r=0,rr=0;
for(int i=2;i<=n;i*=2)
{ int l=0,ll=0,r=0,rr=0;
for(int j=1;j<=n;j++)//每次循环,都从1到n遍历
{ if(j>rr)
{ l=j;//把当前j给成最左边的位置
rr+=i;//最右边的加到i;
r=rr-(i/2);
ll=r+1;
}
if(j<=r)
{ TT=ll;
TTT=rr;
}
else
{ TT=l;
TTT=r;
}
dp[j][cnt+1]=0;
for(int x=TT;x<=TTT;x++)
dp[j][cnt+1]+=dp[x][cnt]*dp[j][cnt]*a[j][x];
printf("%d %d %d %d %d %d\n",i,j,ll,rr,l,r);
}
cnt++;
}
printf("%.6f\n",dp[1][cnt]);
}
return 0;
}