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("\n");
    }
    return 0;
}

 

 

 

posted @ 2013-09-08 23:50  fangguo  阅读(354)  评论(8编辑  收藏  举报