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; }