隐马尔可夫模型介绍见这里:点击打开链接
1 3 Dry Damp Soggy
Case #1: Sunny Cloudy RainyHintLog is useful.
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; int n; double lea[3][4]= { {0.6,0.2,0.15,0.05}, {0.25,0.3,0.2,0.25}, {0.05,0.1,0.35,0.5} }; double wea[3][3]= { {0.5,0.375,0.125}, {0.25,0.125,0.625}, {0.25,0.375,0.375} }; int ord[100],pre[100][100]; double dp[100][100]; void output(int day,int weather) { if(day<0) return; output(day-1,pre[day][weather]); //cout<<"day: "<<day<<" weather: "<<weather<<endl; if(weather==0) puts("Sunny"); else if(weather==1) puts("Cloudy"); else if(weather==2) puts("Rainy"); } int main() { int T_T,cas=1; scanf("%d",&T_T); for(int i=0;i<3;i++) { for(int j=0;j<4;j++) { lea[i][j]=log(lea[i][j]); if(j<3) wea[i][j]=log(wea[i][j]); } } while(T_T--) { scanf("%d",&n); memset(dp,0,sizeof(dp)); memset(pre,0,sizeof(pre)); char leaf[20]; for(int i=0;i<n;i++) { scanf("%s",leaf); if(strcmp(leaf,"Dry")==0) ord[i]=0; else if(strcmp(leaf,"Dryish")==0) ord[i]=1; else if(strcmp(leaf,"Damp")==0) ord[i]=2; else ord[i]=3; } dp[0][0]=log(0.63)+lea[0][ord[0]]; dp[0][1]=log(0.17)+lea[1][ord[0]]; dp[0][2]=log(0.2)+lea[2][ord[0]]; for(int i=1;i<n;i++) { for(int j=0;j<3;j++) { double mx=-1000000000;int mr=-1; for(int k=0;k<3;k++) { double temp=dp[i-1][k]+wea[k][j]+lea[j][ord[i]]; if(temp>mx) { mx=temp; mr=k; } } dp[i][j]=mx; pre[i][j]=mr; } } double mx=-1000000000;int mr=-1; for(int i=0;i<3;i++) { if(mx<dp[n-1][i]) { mr=i; mx=dp[n-1][i]; } } printf("Case #%d:\n",cas++); output(n-1,mr); } return 0; }
HDOJ 4865 Peter's Hobby,布布扣,bubuko.com
原文:http://blog.csdn.net/ck_boss/article/details/38073223