C-world-up-黑龙江12届省赛热身赛

来源:互联网 发布:mac air怎么下载office 编辑:程序博客网 时间:2024/04/29 16:31

给定一个矩阵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;}
0 0