首页 > 代码库 > hdu4865Peter's Hobby马尔科夫过程
hdu4865Peter's Hobby马尔科夫过程
#include<iostream> #include<string> #include<cmath> #include<map> #include<vector> using namespace std; double p1[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 p2[3][3]={0.5,0.375,0.125,0.25,0.125,0.625,0.25,0.375,0.375}; double fu[50][3]={log(0.63),log(0.17),log(0.2)},pre[50][3]; map<string,int>m1; map<int,string>m2; void init() { m1.insert(make_pair("Dry",0)); m1.insert(make_pair("Dryish",1)); m1.insert(make_pair("Damp",2)); m1.insert(make_pair("Soggy",3)); m2.insert(make_pair(0,"Sunny")); m2.insert(make_pair(1,"Cloudy")); m2.insert(make_pair(2,"Rainy")); } void work() { double t,tt,ttt; int n,i,j,k,x,y,r; string s; cin>>n; cin>>s; i=m1[s]; for(j=0;j<3;j++) fu[0][j]=fu[0][j]+log(p1[j][i]); for(i=1;i<n;i++) { cin>>s; y=i-1; j=m1[s]; for(k=0;k<3;k++) { t=log(0); for(x=0;x<3;x++) { tt=fu[y][x]+log(p2[x][k])+log(p1[k][j]); if(t<tt) { t=tt; r=x; } } pre[i][k]=r; fu[i][k]=t; } } t=log(0); i=n-1; for(j=0;j<3;j++) if(t<fu[i][j]) { t=fu[i][j]; r=j; } vector<int>v; v.push_back(r); for(i=n-1;i>0;i--) { v.push_back(pre[i][r]); r=pre[i][r]; } for(i=n-1;i>-1;i--) cout<<m2[v[i]]<<endl; } int main() { int exp,i; init(); cin>>exp; for(i=1;i<=exp;i++) { printf("Case #%d:\n",i); work(); } }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。