zoukankan      html  css  js  c++  java
  • 【解题报告】【概率DP入门】 P1850 换教室

    这道题是一道非常基本的期望的题目,我们只需要抓住关键,就是我们递推直接进行DP就可以了,至于我们的最短路部分,因为数据并不是非常的大,所以说我们直接使用弗洛伊德算法即可。然后根据期望的定义,我们使用期望等于概率乘上价值进行计算即可,然后使用刷表法每次判最小进行递推即可。

    因为时间原因我这里不详细讲解,这里有一篇写的非常好的博客推荐给大家。

    链接:NOIP2016换教室

    本人AC代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=2e3+5;
    const double inf=0x7fffffff;
    int n,m,v,e,c[N],d[N],mp[305][305];
    double k[N],dp[N][N][2];
    void init()
    {
        memset(mp,63,sizeof(mp));
        scanf("%d%d%d%d",&n,&m,&v,&e);
        for(int i=1;i<=n;++i) scanf("%d",&c[i]);
        for(int i=1;i<=n;++i) scanf("%d",&d[i]);
        for(int i=1;i<=n;++i) scanf("%lf",&k[i]);
        for(int i=1;i<=e;++i)
        {
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            mp[x][y]=mp[y][x]=min(mp[y][x],z);
        }
        for(int k=1;k<=v;++k)
            for(int i=1;i<=v;++i)
                for(int j=1;j<=v;++j)
                mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
        for(int i=1;i<=v;++i) mp[i][i]=mp[i][0]=mp[0][i]=0;
        for(int i=0;i<=n;++i) for(int j=0;j<=m;++j) dp[i][j][0]=dp[i][j][1]=inf;
        dp[1][0][0]=dp[1][1][1]=0;
        
    }
    int main()
    {
        init();
        for(int i=2;i<=n;++i)
        {
            dp[i][0][0]=dp[i-1][0][0]+mp[c[i-1]][c[i]];
            for(int j=1;j<=min(i,m);++j)
            {
                int c1=c[i-1],c2=d[i-1],c3=c[i],c4=d[i];
                dp[i][j][0] = min(dp[i][j][0],min(dp[i-1][j][0]+mp[c1][c3],dp[i-1][j][1]+mp[c1][c3]*(1-k[i-1])+mp[c2][c3]*k[i-1]));
                dp[i][j][1] = min(dp[i][j][1],min(dp[i-1][j-1][0]+mp[c1][c3]*(1-k[i])+mp[c1][c4]*k[i],dp[i-1][j-1][1]+mp[c1][c3]*(1-k[i-1])*(1-k[i])+mp[c1][c4]*(1-k[i-1])*k[i]+mp[c2][c3]*k[i-1]*(1-k[i])+mp[c2][c4]*k[i-1]*k[i]));
            }
        }
        double ans=inf;
        for(int i=0;i<=m;++i)ans=min(ans,min(dp[n][i][0],dp[n][i][1]));
        printf("%.2lf",ans);
        return 0;
    } 
    
  • 相关阅读:
    Python使用SMTP模块、email模块发送邮件
    harbor搭建及使用
    ELK搭建-windows
    ELK技术栈之-Logstash详解
    【leetcode】1078. Occurrences After Bigram
    【leetcode】1073. Adding Two Negabinary Numbers
    【leetcode】1071. Greatest Common Divisor of Strings
    【leetcode】449. Serialize and Deserialize BST
    【leetcode】1039. Minimum Score Triangulation of Polygon
    【leetcode】486. Predict the Winner
  • 原文地址:https://www.cnblogs.com/mudrobot/p/13329336.html
Copyright © 2011-2022 走看看