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[n]=st[b1]*wl[b1][a1]*ww[b1][b2]*wl[b2][a2]*......*ww[bn-1][bn]*wl[bn][an]。即log(g[n])=log(st[b1])+log(wl[b1][a1])+log(ww[b1][b2])+log(wl[b2][a2])+......+log(ww[bn-1][bn])+log(wl[bn][an])。

求log(g[n])的最大值相应的序列就是天气序列。

相当于给一个n*3的矩阵。代表有n天,每天有3种天气,从第一行到第n行求出一条最长路,输出路径。



  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <map>
  4. #include <set>
  5. #include <stack>
  6. #include <vector>
  7. #include <math.h>
  8. #include <string.h>
  9. #include <queue>
  10. #include <string>
  11. #include <stdlib.h>
  12. #include <algorithm>
  13. #define LL long long
  14. #define _LL __int64
  15. #define eps 1e-12
  16. #define PI acos(-1.0)
  17. using namespace std;
  18.  
  19. const int INF = 0x3f3f3f3f;
  20. double wl[3][4] = {
  21. {0.6,0.2,0.15,0.05},
  22. {0.25,0.3,0.2,0.25},
  23. {0.05,0.10,0.35,0.50}};
  24.  
  25. double ww[3][3] = {
  26. {0.5,0.375,0.125},
  27. {0.25,0.125,0.625},
  28. {0.25,0.375,0.375}
  29. };
  30.  
  31. double st[3] = {0.63,0.17,0.2};
  32. int n;
  33. char s[10];
  34. int a[55];
  35. double f[55][5];
  36. double dp[55][5];
  37. int pre[55][5];
  38.  
  39. stack <int> sta;
  40.  
  41. int init(char s[])
  42. {
  43. if(strcmp(s,"Dry") == 0)
  44. return 0;
  45. if(strcmp(s,"Dryish") == 0)
  46. return 1;
  47. if(strcmp(s,"Damp") == 0)
  48. return 2;
  49. if(strcmp(s,"Soggy") == 0)
  50. return 3;
  51. }
  52.  
  53. void To()
  54. {
  55. for(int i = 0; i < 3; i++)
  56. {
  57. for(int j = 0; j < 3; j++)
  58. ww[i][j] = log(ww[i][j]);
  59. }
  60. for(int i = 0; i < 3; i++)
  61. st[i] = log(st[i]);
  62. }
  63.  
  64. int main()
  65. {
  66. To();
  67. int test;
  68. scanf("%d",&test);
  69. for(int item = 1; item <= test; item++)
  70. {
  71. scanf("%d",&n);
  72. memset(pre,-1,sizeof(pre));
  73. memset(f,0,sizeof(f));
  74. for(int i = 1; i <= n; i++)
  75. {
  76. scanf("%s",s);
  77. a[i] = init(s);
  78. }
  79.  
  80. for(int i = 1; i <= n; i++)
  81. {
  82. //对于当前天的叶子状态是固定的。如今的f[i][j]表示第i天在叶子固定的条件下天气为j的概率。
  83. //所以f[i][j]为每种天气占总天气的比值
  84. double t = 0;
  85. for(int j = 0; j < 3; j++)
  86. {
  87. f[i][j] = wl[j][a[i]];
  88. t += wl[j][a[i]];
  89. }
  90. for(int j = 0; j < 3; j++)
  91. f[i][j] /= t;
  92. }
  93.  
  94. for(int i = 1; i <= n; i++)
  95. {
  96. for(int j = 0; j < 3; j++)
  97. f[i][j] = log(f[i][j]);
  98. }
  99. memset(dp,-INF,sizeof(dp));
  100. for(int j = 0; j < 3; j++)
  101. dp[1][j] = st[j] + f[1][j];
  102.  
  103. for(int i = 2; i <= n; i++)
  104. {
  105. for(int j = 0; j < 3; j++)
  106. {
  107. for(int k = 0; k < 3; k++)
  108. {
  109. double t = dp[i-1][k] + ww[k][j] + f[i][j];
  110. if(dp[i][j] < t)
  111. {
  112. dp[i][j] = t;
  113. pre[i][j] = k;
  114. }
  115. }
  116. }
  117. }
  118. int p = n;
  119. int c;
  120. double Max = -INF;
  121.  
  122. for(int j = 0; j < 3; j++)
  123. {
  124. if(dp[n][j] > Max)
  125. {
  126. Max = dp[n][j];
  127. c = j;
  128. }
  129. }
  130.  
  131. while(!sta.empty()) sta.pop();
  132.  
  133. sta.push(c);
  134. while(pre[p][c] != -1)
  135. {
  136. sta.push(pre[p][c]);
  137. c = pre[p][c];
  138. p--;
  139. }
  140.  
  141. printf("Case #%d:\n",item);
  142. while(!sta.empty())
  143. {
  144. if(sta.top() == 0)
  145. printf("Sunny\n");
  146. if(sta.top() == 1)
  147. printf("Cloudy\n");
  148. if(sta.top() == 2)
  149. printf("Rainy\n");
  150. sta.pop();
  151. }
  152. }
  153. return 0;
  154. }

hdu 4865 Peter&#39;s Hobby(概率dp)的更多相关文章

  1. 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) To ...

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

    Peter's Hobby Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  3. hdu 4865 Peter&#39;s Hobby

    Peter's Hobby Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  4. HDU 4865 Peter's Hobby(2014 多校联合第一场 E)(概率dp)

    题意:已知昨天天气与今天天气状况的概率关系(wePro),和今天天气状态和叶子湿度的概率关系(lePro)第一天为sunny 概率为 0.63,cloudy 概率 0.17,rainny 概率 0.2 ...

  5. 2014多校第一场 E 题 || HDU 4865 Peter's Hobby (DP)

    题目链接 题意 : 给你两个表格,第一个表格是三种天气下出现四种湿度的可能性.第二个表格是,昨天出现的三种天气下,今天出现三种天气的可能性.然后给你这几天的湿度,告诉你第一天出现三种天气的可能性,让你 ...

  6. HDU 4405:Aeroplane chess(概率DP入门)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=4405 Aeroplane chess Problem Description   Hzz loves ...

  7. 2015多校第7场 HDU 5378 Leader in Tree Land 概率DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5378 题意:一棵n个节点的树.对其节点进行标号(1~n).求恰好存在k个节点的标号是其节点所在子树的最 ...

  8. HDU 4336 Card Collector(动态规划-概率DP)

    Card Collector Problem Description In your childhood, do you crazy for collecting the beautiful card ...

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

    给出2个影响矩阵,一个是当天天气对湿度的影响,一个是前一天天气对当天天气的影响. 即在晴天(阴天.雨天)发生Dry(Dryish.Damp.Soggy)的概率,以及前一天晴天(阴天.雨天)而今天发生晴 ...

随机推荐

  1. javaresource 红色X

    出现这个问题的原因很多,解决办法也很多,我这里只记录我所遇到的. 这个问题一直存在,但是不影响项目运行. 后来在网上找了下资料,有一篇文章是让修改maven的settings.xml.将jdk1.6修 ...

  2. 仿querySeletor 兼容IE 67

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. HeapAlloc 和 GlobalAlloc 以及 VirtualAlloc 三者之间的关系(转)

    VirtualAlloc 一次分配 1PAGE 以上的 RAM. 每次分配都是 PAGE 的整数倍. 你不会想为了分配 1 个 BYTE 的空间而浪费剩下的 4095 字节. OK, 你可以自己写算法 ...

  4. WordPress Permissions Update Error [RESOLVED]

    Recently I ran into an issue where an installation of WordPress that had never had any issues updati ...

  5. 在Windows Server 2008 R2中使用web方式修改域用户账户密码

    在Windows的domain环境下,加域的客户端修改账户密码是一件很easy的事情:即使没有加域的客户端如果组织中,使用Exchange邮件系统,借助Exchange的owa也可以轻松修改账户密码. ...

  6. Spring 反射注入+全注解注入

    Spring IoC容器会先把所有的Bean都进行实例化,不管是要用到的火鼠用不到的,如果你想暂时不进行Bean的实例化,要用到属性lazy-init="true". Spring ...

  7. bat薪酬

    三大互联网巨头公司,百度腾讯跟阿里如何划分级别?薪资待遇又有多少?除非身居其位,否则很难探知,但是等你到那个位置知道了,却又不能说,至少不能在公 开场合谈论.接下来就为大家揭秘,百度.阿里与腾讯内部的 ...

  8. 26个Jquery1.4使用小技巧

    1. 禁止右键点击 1.       $(document).ready(function(){ 2.           $(document).bind("contextmenu&quo ...

  9. Adhoc

    没觉得Adhoc还有什么做的,这几年貌似很冷了,从通信的角度讲,实现比较困难,实际意义不大,国内最近又跟风了VANET.以我同学做的为例,他考虑用Adhoc做野外分散点的自组网(一个集体内),但从通信 ...

  10. C++ cout 格式化输出方法

    C语言里可以用printf(),%f来实现浮点数的格式化输出,用cout呢...? iomanip是I/O流控制头文件,就像printf的格式化输出一样. 以下是一些常用的: dec 置基数为10 相 ...