题意:已知昨天天气与今天天气状况的概率关系(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]])) (k=0,1,2 表示昨天的天气)

注:由于概率越乘越小,考虑精度原因,用log取对数
log(a*b*c) = log a + log b +log c

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<math.h>
  4. char yezi[][]= {"Dry","Dryish","Damp","Soggy"};
  5. char wea[][]= {"Sunny","Cloudy","Rainy"};
  6. double yeP[][]= {0.6,0.2,0.15,0.05,
  7. 0.25,0.3,0.2,0.25,
  8. 0.05,0.10,0.35,0.50
  9. };
  10. double weaP[][]= {0.5,0.375,0.125,
  11. 0.25,0.125,0.625,
  12. 0.25,0.375,0.375
  13. };
  14. double init[]= {0.63,0.17,0.2};
  15. double dp[][],pre[][];
  16. int n;
  17. double maxp;
  18. int Pos[];
  19. void solve()
  20. {
  21. for(int i=; i<; i++)
  22. {
  23. dp[][i]=log(init[i])+log(yeP[i][Pos[]]);
  24. //第1天天气为i的概率=初始的天气为i的概率*(第一天叶子为Pos[1]的的状态下天气为i的概率)
  25. }
  26. for(int i=; i<=n; i++) //
  27. {
  28. for(int j=; j<; j++) //天气
  29. {
  30. double maxp=-1e8;
  31. int pos=;//记录天气
  32. for(int k=; k<; k++) //第i-1天天气为k
  33. {
  34. double temp=dp[i-][k]+log(weaP[k][j])+log(yeP[j][Pos[i]]);
  35. //昨天天气为k的概率*昨天天气为k今天天气为j的概率*叶子状态为Pos[i]时天气为j的概率
  36. if(temp>maxp)
  37. {
  38. maxp=temp;
  39. pos=k;//记录最有可能的天气状况为k
  40. }
  41. }
  42. dp[i][j]=maxp;//第i天天气状况为j的概率
  43. pre[i][j]=pos; //表示第i天天气最可能为j的前一天天气
  44. }
  45. }
  46. }
  47. int main()
  48. {
  49. int k=;
  50. int T;
  51. char yeC[];
  52. scanf("%d",&T);
  53. while(T--)
  54. {
  55. k++;
  56. printf("Case #%d:\n",k);
  57. scanf("%d",&n);
  58. for(int i=; i<=n; i++)
  59. {
  60. scanf("%s",yeC);
  61. for(int j=; j<; j++)
  62. if(strcmp(yeC,yezi[j])==)
  63. {
  64. Pos[i]=j;
  65. break;
  66. }
  67. }
  68. solve();
  69. double maxp=-1e8;
  70. int ans[];
  71. for(int i=; i<; i++)//第n天最有可能的天气
  72. if(dp[n][i]>maxp)
  73. {
  74. maxp=dp[n][i];
  75. ans[n]=i;
  76. }
  77. for(int i=n-;i>=;i--)
  78. ans[i]=pre[i+][ans[i+]]; //由最后一天往前找每天的天气状况记录在ans 中
  79. for(int i=;i<=n;i++)
  80. printf("%s\n",wea[ans[i]]);
  81. }
  82. return ;
  83. }

资料扩展:详情点此
本题属于 隐马尔可夫模型
马尔可夫模型:统计模型,每个状态只依赖于之前的状态

马尔可夫模型可用马尔可夫过程描述
我们就为上面的一阶马尔科夫过程定义了以下三个部分:
  状态:晴天、阴天和下雨
  初始向量:定义系统在时间为0的时候的状态的概率
  状态转移矩阵:每种天气转换的概率
  所有的能被这样描述的系统都是一个马尔科夫过程。

隐马尔可夫模型 (Hidden Markov Model) 是一种统计模型,用来描述一个含有隐含未知参数的马尔可夫过程。
包含隐藏状态 (如:天气状态)和 可观状态(如:叶子的湿度)
可以观察到的状态序列和隐藏的状态序列是概率相关的

HDU 4865 Peter's Hobby(2014 多校联合第一场 E)(概率dp)的更多相关文章

  1. HDU 4870 Rating (2014 多校联合第一场 J)(概率)

    题意: 一个人有两个TC的账号,一开始两个账号rating都是0,然后每次它会选择里面rating较小的一个账号去打比赛,每次比赛有p的概率+1分,有1-p的概率-2分,当然如果本身是<=2分的 ...

  2. HDU 4869 Turn the pokers (2014 多校联合第一场 I)

    HDOJ--4869--Turn the pokers[组合数学+快速幂] 题意:有m张扑克,开始时全部正面朝下,你可以翻n次牌,每次可以翻xi张,翻拍规则就是正面朝下变背面朝下,反之亦然,问经过n次 ...

  3. 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 ...

  4. hdu 4869 Turn the pokers (2014多校联合第一场 I)

    Turn the pokers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  5. HDU 4868 Information Extraction(2014 多校联合第一场 H)

    看到这道题时我的内心是奔溃的,没有了解过HTML,只能靠窝的渣渣英语一点一点翻译啊TT. Information Extraction 题意:(纯手工翻译,有些用词可能在html中不是一样的,还多包涵 ...

  6. hdu 5288||2015多校联合第一场1001题

    pid=5288">http://acm.hdu.edu.cn/showproblem.php?pid=5288 Problem Description OO has got a ar ...

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

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

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

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

  9. HDU 4865 Peter's Hobby --概率DP

    题意:第i天的天气会一定概率地影响第i+1天的天气,也会一定概率地影响这一天的湿度.概率在表中给出.给出n天的湿度,推测概率最大的这n天的天气. 分析:这是引自机器学习中隐马尔科夫模型的入门模型,其实 ...

随机推荐

  1. Pyton——int内部功能介绍

    int内部功能详解: class int(object): """ int(x=0) -> integer int(x, base=10) -> intege ...

  2. POJ 1830 【高斯消元第一题】

    首先...使用abs()等数学函数的时候,浮点数用#include<cmath>,其它用#include<cstdlib>. 概念: [矩阵的秩] 在线性代数中,一个矩阵A的列 ...

  3. Android编程心得-设计一个可重用的自定义Dialog

            我们在实际开发过程中,会遇到一个问题,我们的Dialog如果使用一般的方法进行设置调用出来,会有很多的重复代码,如何将Dialog按照自己的思路设计呢,并让其可重用呢,下面我来介绍一下 ...

  4. 在Vista以上版本运行WTL程序,有时候会提示“这个程序可能安装补正确...”的错误

    在Win7/Vista下,如何以兼容模式运行exe?     https://msdn.microsoft.com/en-us/library/dd371711(VS.85).aspx     问题描 ...

  5. 1688: [Usaco2005 Open]Disease Manangement 疾病管理( 枚举 )

    我一开始写了个状压dp..然后没有滚动就MLE了... 其实这道题直接暴力就行了... 2^15枚举每个状态, 然后检查每头牛是否能被选中, 这样是O( 2^15*1000 ), 也是和dp一样的时间 ...

  6. Python 第一篇:python简介和入门

    一.python简介 1.python下载地址:https://www.python.org/downloads/ Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆 ...

  7. mysql事务和锁InnoDB(转)

    背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题.本文,准备 ...

  8. STM32 + RT Thread OS 学习笔记[二]

    串口通讯例程 通过上面的练习,对STM32项目开发有了一个直观印象,接下来尝试对串口RS232进行操作. 1.   目标需求: 开机打开串口1,侦听上位机(使用电脑串口测试软件)发送的信息,然后原样输 ...

  9. 在uboot里面加入环境变量使用run来运行

    Author:杨正  Date:2014.11.11   Email:yz2012ww@gmail.com QQ:1209758756 在移植uboot的时候,能够在uboot里面加入定义一些自己的环 ...

  10. VC++编程之字符串解惑--Unicode & MBCS

    VC++中的字符串用起来着实让人难受,LPTSTR.LPCTSTR.LPCSTR.LPCWSTR.LPSTR.WCHAR.CString._T()和L彼此之间的互相转换更是头痛.根据使用经验和MSDN ...