【NOIP2016】换教室(期望dp)

来源:互联网 发布:折线图数据单位不一样 编辑:程序博客网 时间:2024/05/14 18:35

题目:

我是超链接

题解:

昔日的伤痕再揭开依然很疼,这道题就是当时一急连暴力都没有写......

现在看来确是最简单的期望dp

兼顾着上一次申请过没过哦,毕竟涉及到现在的位置

代码:

#include <cstdio>#include <iostream>#include <cstring>#define INF 1e9using namespace std;int n,m,v,e,c[2005],d[2005],f[305][305];double p[2005],dp[2005][2005][2];int main(){int i,a1,b1,c1,k,j;scanf("%d%d%d%d",&n,&m,&v,&e);for (i=1;i<=n;i++)  scanf("%d",&c[i]);for (i=1;i<=n;i++)  scanf("%d",&d[i]);for (i=1;i<=n;i++) scanf("%lf",&p[i]);memset(f,0x7f,sizeof(f));for (i=1;i<=e;i++) {scanf("%d%d%d",&a1,&b1,&c1); if (c1<f[a1][b1])   f[a1][b1]=f[b1][a1]=c1;}for (i=1;i<=v;i++) f[i][i]=0; for (k=1;k<=v;k++)  for (i=1;i<=v;i++)    for (j=1;j<=v;j++)       if (f[i][k]<INF && f[k][j]<INF && f[i][j]>f[i][k]+f[k][j])    f[i][j]=f[i][k]+f[k][j];//dp[i][j][0/1]表示前i个时间选j节课这门课申不申请的路程期望     memset(dp,0x7f,sizeof(dp));    dp[1][0][0]=0;dp[1][1][1]=0;for (i=2;i<=n;i++)  {dp[i][0][0]=dp[i-1][0][0]+f[c[i-1]][c[i]];for (j=1;j<=min(m,i);j++)      {    dp[i][j][0]=min(dp[i-1][j][0]+f[c[i-1]][c[i]],dp[i-1][j][1]+f[d[i-1]][c[i]]*p[i-1]+f[c[i-1]][c[i]]*(1.0-p[i-1]));    double x1,x2;    x1=dp[i-1][j-1][0]+f[c[i-1]][d[i]]*p[i]+f[c[i-1]][c[i]]*(1.0-p[i]);    x2=dp[i-1][j-1][1]+f[c[i-1]][d[i]]*p[i]*(1.0-p[i-1])+f[c[i-1]][c[i]]*(1.0-p[i-1])*(1.0-p[i])+f[d[i-1]][d[i]]*p[i]*p[i-1]+f[d[i-1]][c[i]]*(1.0-p[i])*p[i-1];dp[i][j][1]=min(x1,x2);}}double ans=dp[n][0][0];for (i=1;i<=m;i++)   ans=min(ans,min(dp[n][i][0],dp[n][i][1]));printf("%.2lf",ans);}


原创粉丝点击