隐马尔可夫模型介绍见这里:点击打开链接


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