zoukankan      html  css  js  c++  java
  • 状态压缩DP

    status{x1,x2,x3,x4,………xn-1,xn}表示每只鱼是否还活着的状态 xi=1表示第i条鱼还活着 xi=0表示第i条鱼已经被吃掉了 dp(status)表示形成status这种状态的概率 那么刚开始的时候(第一天),所有的鱼都活着。 那么dp({1,1,1,1….,1,1,1})=1。

    学长的AC的代码:

    #include <cstdio>
    #include <cstring>
    double dp[1<<18];
    double mat[18][18];

    int bitcount(int t){
    int ret = 0;
    while(t){
    ret += t&1;
    t >>= 1;
    }
    return ret;
    }

    int main(){
    int n;
    scanf("%d",&n);
    for(int i = 0;i < n;i++){
    for(int j = 0;j < n;j++){
    scanf("%lf",&mat[i][j]);
    }
    }
    dp[(1<<n)-1] = 1;
    for(int i = (1<<n)-1;i >= 1;i--){
    int bit = bitcount(i);
    if(bit == 1) continue;
    double p = 2*dp[i]/bit/(bit-1);
    for(int j = 0;j < n;j++)if(i&(1<<j)){
    for(int k = 0;k < n;k++)if(i&(1<<k)){
    dp[i^(1<<k)] += p*mat[j][k];
    }
    }
    }
    for(int i = 0;i < n;i++){
    printf("%.6f ",dp[1<<i]);
    }
    return 0;
    }

    dp[(1<<n)-1] = 1;
    //看似不起眼的小动作居然是将这个数组完全初始化为1的操作,值得参考

    //每一步的概率应当是保存在p这个值当中

    double dp[1<<18]; //这个是最后一步的计算结果
    double mat[18][18]; //用来保存概率

    我要坚持一年,一年后的成功才是我想要的。
  • 相关阅读:
    矩阵快速幂 ——(递推表达式)
    简易五子棋 V1.1.0
    自己写的五子棋
    公共子序列
    阮一峰 KMP BM算法
    「SDOI2013」森林
    「SPOJ1487」Query on a tree III
    「luogu3810」陌上花开
    「CQOI2011」动态逆序对
    「APIO2012」派遣
  • 原文地址:https://www.cnblogs.com/tianxia2s/p/3873504.html
Copyright © 2011-2022 走看看