给出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] 。

 #include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std; double aa[][]={
0.6, 0.2, 0.15, 0.05,
0.25, 0.3, 0.2, 0.25,
0.05, 0.10, 0.35, 0.50
};
double bb[][]={
0.5, 0.375, 0.125,
0.25, 0.125, 0.625,
0.25, 0.375, 0.375
};
int main(){
for(int i=;i<;++i)for(int j=;j<;++j) aa[i][j] = log(aa[i][j]);
for(int i=;i<;++i)for(int j=;j<;++j) bb[i][j] = log(bb[i][j]);
int t,n,lea[],ca=;
double dp[][];
int pre[][];
int ans[];
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=;i<n;++i){
char s[];
scanf("%s",s);
if(strcmp(s,"Dry")==) lea[i]=;
else if(strcmp(s,"Dryish")==) lea[i]=;
else if(strcmp(s,"Damp")==) lea[i]=;
else lea[i]=;
}
dp[][] = log(0.63)+aa[][lea[]];
dp[][] = log(0.17)+aa[][lea[]];
dp[][] = log(0.20)+aa[][lea[]];
for(int i=;i<n;++i){
for(int j=;j<;++j){
double ma = -1e8; int idx;
for(int k=;k<;++k){
if(dp[i-][k]+bb[k][j]+aa[j][lea[i]] >ma){
ma = dp[i-][k]+bb[k][j]+aa[j][lea[i]];
idx = k;
}
}
dp[i][j] = ma, pre[i][j]=idx;
}
}
double ma=-1e8;int idx;
for(int j=;j<;++j)if(dp[n-][j]>ma){ma=dp[n-][j];idx=j;}
ans[n-]=idx;
for(int i=n-;i;--i){
ans[i-] = pre[i][idx];
idx = pre[i][idx];
}
printf("Case #%d:\n",++ca);
for(int i=;i<n;++i){
if(ans[i]==)puts("Sunny");
else if(ans[i]==)puts("Cloudy");
else puts("Rainy");
}
}
return ;
}

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

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

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

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

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

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

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

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

  4. HDU 4865 Peter's Hobby

    $dp$. 这题的本质和求一个有向无环图的最长路径长度的路径是一样的. $dp[i][j]$表示到第$i$天,湿度为$a[i]$,是第$j$种天气的最大概率.记录一下最大概率是$i-1$天哪一种天气推 ...

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

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

  7. hdu 4865 Peter&#39;s Hobby

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

  8. HDU 5781 ATM Mechine (概率DP)

    ATM Mechine 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5781 Description Alice is going to take ...

  9. HDU 4050 wolf5x(动态规划-概率DP)

    wolf5x Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

随机推荐

  1. [译]Exploring Angular 1.3: Binding to Directive Controllers

    原文: http://blog.thoughtram.io/angularjs/2015/01/02/exploring-angular-1.3-bindToController.html Angul ...

  2. 【AngularJS】—— 2 初识AngularJs(续)

    前一篇了解了AngularJS的一些简单的使用,这里继续跟着w3c学习一下剩下的内容. 本篇根据w3cschool.cc继续学习AngularJS剩余的内容,包括: 1 事件 2 模块 3 表单 4 ...

  3. mysql 总结二(自定义存储过程)

    mysql执行流程: sql命令--->mysql引擎-----(分析)---->语法正确-----(编译)--->可识别命令----(执行)---->执行结果---(返回)- ...

  4. Nginx安装配置(转)

    Nginx 安装配置 Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/ ...

  5. Windows疑难杂症之开机无法显示桌面。

    开机无法显示桌面可能有以下两种情况. 1.系统故障或病毒引起explorer.exe无法加载启动. 2.注册表故障造成默认的值不是explorer.exe.(可能是安装了某些软件造成此问题) 3,某开 ...

  6. Linq查询操作语句学习

    对于一个集合,我们通常会用foreach或者for循环来判断查找里面的元素. 但这种方法通常会看起来比较复杂,我们可以使用linq. Linq允许编写C#代码以查询数据库相同的方式操作内存数据(写法类 ...

  7. button 按钮

    <!DOCTYPE html> <html> <body> <h1>我的第一段 JavaScript</h1> <p> Java ...

  8. PHP简易聊天室&调试问题

    在进入login.php程序之后 <?php error_reporting(E_ALL^E_NOTICE); session_start();  //装载Session库,一定要放在首行 $u ...

  9. python 多线程就这么简单(转)

    多线程和多进程是什么自行google补脑 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用简单的例子,让你对多线程有个初步的认识. 单线程 在好些年前的 ...

  10. Call to undefined function mysqli_connect()

    PHP5.0后新支持一个mysqli.dll的扩展功能,能让用户更加简洁的调用mysql数据库. 需要在Php.ini配置中将下面代码前的;去掉.extension=php_mysqli.dll