codevs 1997 守卫者的挑战

/*
表示很遗憾..
开始状态想的没错 就是转移的时候出了问题 自己也想到了数组平移
然而没往下写 与正解擦肩而过….
然后为了好转移写了个4维的 时间不多了没来得及降维 草草的算算空间就交了…
尼玛double忘记*8了 华丽的直接Memory limit exceeded while compiling
我尼玛0分
考试后写了写用原来的状态写了写数组平移然后降维
数据太水就A了

*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 210
#define base 200
using namespace std;
int n,l,K,p[maxn],c[maxn],sum;
double f[2][maxn*10][maxn],ans;
int main()
{
    scanf("%d%d%d",&n,&l,&K);sum+=K;
    for(int i=1;i<=n;i++)scanf("%d",&p[i]);
    for(int i=1;i<=n;i++)
      {
          scanf("%d",&c[i]);
          if(c[i]!=-1)sum+=c[i];
      }
    f[0][K+base][0]=1;
    for(int i=1;i<=n;i++)
      {
          for(int j=sum+base;j>=0;j--)
          for(int k=n;k>=0;k--)
          {
            if(k>0&&j>=c[i])f[i&1][j][k]+=f[(i-1)&1][j-c[i]][k-1]*(double(p[i])/100.0);//赢了 
            f[i&1][j][k]+=f[(i-1)&1][j][k]*(double(100-p[i])/100.0);//输了 
          }
        for(int j=sum+base;j>=0;j--)
          for(int k=n;k>=0;k--)
            f[(i-1)&1][j][k]=0;
      }
    for(int i=base;i<=sum+base;i++)
      for(int j=l;j<=n;j++)
        ans+=f[n&1][i][j];
    printf("%.6f
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/yanlifneg/p/5781706.html