zoukankan      html  css  js  c++  java
  • hdu 4711 动态规划

    思路:其实这题是个挺水的动态规划,一开始就能AC,可是不知道错哪了,瞎改瞎交,WA了数十次。AC之后怎么改都是AC,也不知道改了什么地方,郁闷死了~~~难道开始时的测试数据有问题???

    dp[i][j]表示第i天在第j个地方的最大概率,那么dp[i][j]=max(dp[i][j],dp[i-1][k]+p[k][j]+we[i][weh[j]]);

    p[k][j]表示从k到j的概率,we[i][j]表示第i个地方出现j天气的概率。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<cmath>
    #include<algorithm>
    #define inf 100000000
    #define eps 1e-10
    #define Maxn 1001
    using namespace std;
    int n,m,w,weh[1001],pre[Maxn][101];
    double p[101][101],we[101][101],dp[Maxn][101];
    void Out(int day,int c)
    {
        if(day==1){
            printf("%d",c);
            return ;
        }
        Out(day-1,pre[day][c]);
        printf(" %d",c);
    }
    int main()
    {
        int t,i,j;
        double x;
        scanf("%d",&t);
        while(t--){
            scanf("%d%d%d",&n,&m,&w);
            for(i=0;i<=n;i++){
                for(j=0;j<=m;j++){
                    dp[i][j]=-inf;
                }
            }
            for(i=1;i<=n;i++)
                scanf("%d",&weh[i]);
            for(i=0;i<m;i++){
                for(j=0;j<m;j++){
                    scanf("%lf",&x);
                    if(x==0)
                    p[i][j]=-inf;
                    else
                    p[i][j]=log(x);
                }
            }
            for(i=0;i<m;i++){
                for(j=0;j<w;j++){
                    scanf("%lf",&x);
                    if(x==0)
                        we[i][j]=-inf;
                    else
                    we[i][j]=log(x);
                }
            }
            int k,pos;
            double temp=-inf;
            dp[0][0]=0;
            for(i=1;i<=n;i++){
                for(j=0;j<m;j++){
                    for(k=0;k<m;k++){
                        if(dp[i-1][k]+p[k][j]+we[j][weh[i]]>dp[i][j])
                            pre[i][j]=k,dp[i][j]=dp[i-1][k]+p[k][j]+we[j][weh[i]];
                    }
                }
            }
            for(i=0;i<m;i++)
            if(dp[n][i]>temp){
                temp=dp[n][i];
                pos=i;
            }
            Out(n,pos);
            printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    SQL SERVER DBCC命令参考
    Sqlserver 死锁问题
    收集面试题目DB
    收集面试题目Net
    [转]Virtual PC 2007虚拟机上安装Ubuntu 8.10桌面版
    Tcl/tk基础-2
    【转】内存详解
    [转]C# P2P与NAT技术之二
    泛型跟KeyNotFoundException
    用InstallAware 9制作BDE安装程序
  • 原文地址:https://www.cnblogs.com/wangfang20/p/3309037.html
Copyright © 2011-2022 走看看