HDU 4865 Peter's Hobby(概率、dp、log)

给出2个影响矩阵,一个是当天天气对湿度的影响,一个是前一天天气对当天天气的影响。

即在晴天(阴天、雨天)发生Dry(Dryish、Damp、Soggy)的概率,以及前一天晴天(阴天、雨天)而今天发生晴天(阴天、雨天)的概率。

其中第一天的晴天阴天雨天概率为0.63,0.17,0.20

输入n天的湿度情况,输出最有可能的n天的天气。

用dp[i][j]表示第i天为j天气的概率,用pre[i][j]表示它的前驱。

注意由于概率相乘次数过多,要用log放大。。不然会接近0、精度不够、误差大

dp[i][j] = max{dp[i-1][k] + w_w[k][j] + w_h[j][h[i]]},当然这些w_w, w_h要全部都log

w_w[k][j]表示昨天k天气今天j天气的概率,w_h[j][h[i]]表示今天j天气发生h[i]湿度的概率

这样出来的dp[i][j]就可以表示第i天为j天气,且湿度为h[i] 。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cmath>
 4 #include <iostream>
 5 using namespace std;
 6
 7 double aa[3][4]={
 8     0.6, 0.2, 0.15, 0.05,
 9     0.25, 0.3, 0.2, 0.25,
10     0.05, 0.10, 0.35, 0.50
11 };
12 double bb[3][3]={
13     0.5, 0.375, 0.125,
14     0.25, 0.125, 0.625,
15     0.25, 0.375, 0.375
16 };
17  int main(){
18      for(int i=0;i<3;++i)for(int j=0;j<4;++j) aa[i][j] = log(aa[i][j]);
19      for(int i=0;i<3;++i)for(int j=0;j<3;++j) bb[i][j] = log(bb[i][j]);
20      int t,n,lea[55],ca=0;
21      double dp[55][3];
22      int pre[55][3];
23      int ans[55];
24      scanf("%d",&t);
25      while(t--){
26          scanf("%d",&n);
27          for(int i=0;i<n;++i){
28             char s[22];
29              scanf("%s",s);
30             if(strcmp(s,"Dry")==0) lea[i]=0;
31             else if(strcmp(s,"Dryish")==0) lea[i]=1;
32             else if(strcmp(s,"Damp")==0) lea[i]=2;
33             else lea[i]=3;
34          }
35          dp[0][0] = log(0.63)+aa[0][lea[0]];
36          dp[0][1] = log(0.17)+aa[1][lea[0]];
37          dp[0][2] = log(0.20)+aa[2][lea[0]];
38          for(int i=1;i<n;++i){
39              for(int j=0;j<3;++j){
40                 double ma = -1e8; int idx;
41                  for(int k=0;k<3;++k){
42                      if(dp[i-1][k]+bb[k][j]+aa[j][lea[i]] >ma){
43                          ma = dp[i-1][k]+bb[k][j]+aa[j][lea[i]];
44                          idx = k;
45                      }
46                  }
47                  dp[i][j] = ma, pre[i][j]=idx;
48              }
49          }
50          double ma=-1e8;int idx;
51          for(int j=0;j<3;++j)if(dp[n-1][j]>ma){ma=dp[n-1][j];idx=j;}
52          ans[n-1]=idx;
53          for(int i=n-1;i;--i){
54              ans[i-1] = pre[i][idx];
55              idx = pre[i][idx];
56          }
57          printf("Case #%d:\n",++ca);
58          for(int i=0;i<n;++i){
59              if(ans[i]==0)puts("Sunny");
60              else if(ans[i]==1)puts("Cloudy");
61              else puts("Rainy");
62          }
63      }
64      return 0;
65  }

隐马尔可夫模型http://blog.csdn.net/likelet/article/details/7056068

HDU 4865 Peter's Hobby(概率、dp、log),布布扣,bubuko.com

HDU 4865 Peter's Hobby(概率、dp、log)

时间: 2024-10-10 23:51:36

HDU 4865 Peter's Hobby(概率、dp、log)的相关文章

HDU 4865 Peter&#39;s Hobby --概率DP

题意:第i天的天气会一定概率地影响第i+1天的天气,也会一定概率地影响这一天的湿度.概率在表中给出.给出n天的湿度,推测概率最大的这n天的天气. 分析:这是引自机器学习中隐马尔科夫模型的入门模型,其实在这里直接DP就可以了 定义:dp[i][j]为第i天天气为j(0,1,2分别表示三个天气)的概率,path[i][j]记录路径,path[i][j] = k 意思是前一天天气为k时,这一天有最大的概率是天气j. 做一个三重循环,对于每天,枚举今天的天气,再在里面枚举昨天的天气,则有: dp[i][

2014多校第一场 E 题 || HDU 4865 Peter&#39;s Hobby (DP)

题目链接 题意 : 给你两个表格,第一个表格是三种天气下出现四种湿度的可能性.第二个表格是,昨天出现的三种天气下,今天出现三种天气的可能性.然后给你这几天的湿度,告诉你第一天出现三种天气的可能性,让你求出最可能出现的天气序列 . 思路 : 定义第 i 天叶子湿度为hum[i].第 i 天,天气为 j 的最大概率为dp[i][j].wealea[i][j]表示天气为 i 叶子为j的概率,weawea[i][j]表示今天天气为 i 明天天气为j的概率,st[i]表示第一天天气为i的概率.pre[i]

hdu 4865 Peter&#39;s Hobby(概率dp)

http://acm.hdu.edu.cn/showproblem.php?pid=4865 大致题意:有三种天气和四种叶子状态.给出两个表,分别是每种天气下叶子呈现状态的概率和今天天气对明天天气的概率.给出n天叶子的状态,输出最有可能的天气序列. 思路:wl[i][j]表示天气为i,叶子为j的概率,ww[i][j]表示今天天气为i明天天气为j的概率,st[i]表示第一天天气为i的概率. 对于叶子序列{a1,a2......an},存在一个天气序列{b1,b2......bn},那么总的概率g[

hdu 4865 Peter&#39;s Hobby (隐马尔可夫模型 dp)

Peter's Hobby Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 292    Accepted Submission(s): 132 Problem Description Recently, Peter likes to measure the humidity of leaves. He recorded a leaf

hdu 4865 Peter&#39;s Hobby(2014 多校联合第一场 E)

题意:已知昨天天气与今天天气状况的概率关系(wePro),和今天天气状态和叶子湿度的概率关系(lePro)第一天为sunny 概率为 0.63,cloudy 概率 0.17,rainny 概率 0.2.给定n天的叶子湿度状态,求这n天最可能的天气情况 分析:概率dp设 dp[i][j] 表示第i天天气为j的最大概率,pre[i][j]表示第i天天气最可能为j的前一天天气,dp[i][j]=max(dp[i-1][k]+log(wePro[k][j])+log(lePro[j][lePos[i]]

hdu 4865 Peter&#39;s Hobby(2014 多校联合第一场 E)

Peter's Hobby Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 545    Accepted Submission(s): 237 Problem Description Recently, Peter likes to measure the humidity of leaves. He recorded a leaf

HDU 4865 Peter&#39;s Hobby

Peter's Hobby Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 647    Accepted Submission(s): 273 Problem Description Recently, Peter likes to measure the humidity of leaves. He recorded a leaf

hdu 4865 Peter&amp;#39;s Hobby(概率dp)

http://acm.hdu.edu.cn/showproblem.php? pid=4865 大致题意:有三种天气和四种叶子状态.给出两个表,各自是每种天气下叶子呈现状态的概率和今天天气对明天天气的概率. 给出n天叶子的状态.输出最有可能的天气序列. 思路:wl[i][j]表示天气为i,叶子为j的概率,ww[i][j]表示今天天气为i明天天气为j的概率,st[i]表示第一天天气为i的概率. 对于叶子序列{a1,a2......an},存在一个天气序列{b1,b2......bn},那么总的概率

hdu 4865 Peter&amp;#39;s Hobby (隐马尔可夫模型 dp)

Peter's Hobby Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 292    Accepted Submission(s): 132 Problem Description Recently, Peter likes to measure the humidity of leaves. He recorded a leaf