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]; //用来保存概率

    我要坚持一年,一年后的成功才是我想要的。
  • 相关阅读:
    给定一个排序数组,你需要在原地删除重复出现的元素
    OSPF-外部路由
    虚链路
    OSPF域间路由计算,防环
    转 C# 只允许运行一个实例
    转 点击关闭时最小化到任务栏
    C#,int转成string,string转成int
    SQL 查找表名 字段名
    C# *= 运算顺序
    SQL 批量删除表
  • 原文地址:https://www.cnblogs.com/tianxia2s/p/3873504.html
Copyright © 2011-2022 走看看