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行求出一条最长路,输出路径。



#include <stdio.h>
#include <iostream>
#include <map>
#include <set>
#include <stack>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#include <algorithm>
#define LL long long
#define _LL __int64
#define eps 1e-12
#define PI acos(-1.0)
using namespace std; const int INF = 0x3f3f3f3f;
double wl[3][4] = {
{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 ww[3][3] = {
{0.5,0.375,0.125},
{0.25,0.125,0.625},
{0.25,0.375,0.375}
}; double st[3] = {0.63,0.17,0.2};
int n;
char s[10];
int a[55];
double f[55][5];
double dp[55][5];
int pre[55][5]; stack <int> sta; int init(char s[])
{
if(strcmp(s,"Dry") == 0)
return 0;
if(strcmp(s,"Dryish") == 0)
return 1;
if(strcmp(s,"Damp") == 0)
return 2;
if(strcmp(s,"Soggy") == 0)
return 3;
} void To()
{
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
ww[i][j] = log(ww[i][j]);
}
for(int i = 0; i < 3; i++)
st[i] = log(st[i]);
} int main()
{
To();
int test;
scanf("%d",&test);
for(int item = 1; item <= test; item++)
{
scanf("%d",&n);
memset(pre,-1,sizeof(pre));
memset(f,0,sizeof(f));
for(int i = 1; i <= n; i++)
{
scanf("%s",s);
a[i] = init(s);
} for(int i = 1; i <= n; i++)
{
//对于当前天的叶子状态是固定的。如今的f[i][j]表示第i天在叶子固定的条件下天气为j的概率。
//所以f[i][j]为每种天气占总天气的比值
double t = 0;
for(int j = 0; j < 3; j++)
{
f[i][j] = wl[j][a[i]];
t += wl[j][a[i]];
}
for(int j = 0; j < 3; j++)
f[i][j] /= t;
} for(int i = 1; i <= n; i++)
{
for(int j = 0; j < 3; j++)
f[i][j] = log(f[i][j]);
}
memset(dp,-INF,sizeof(dp));
for(int j = 0; j < 3; j++)
dp[1][j] = st[j] + f[1][j]; for(int i = 2; i <= n; i++)
{
for(int j = 0; j < 3; j++)
{
for(int k = 0; k < 3; k++)
{
double t = dp[i-1][k] + ww[k][j] + f[i][j];
if(dp[i][j] < t)
{
dp[i][j] = t;
pre[i][j] = k;
}
}
}
}
int p = n;
int c;
double Max = -INF; for(int j = 0; j < 3; j++)
{
if(dp[n][j] > Max)
{
Max = dp[n][j];
c = j;
}
} while(!sta.empty()) sta.pop(); sta.push(c);
while(pre[p][c] != -1)
{
sta.push(pre[p][c]);
c = pre[p][c];
p--;
} printf("Case #%d:\n",item);
while(!sta.empty())
{
if(sta.top() == 0)
printf("Sunny\n");
if(sta.top() == 1)
printf("Cloudy\n");
if(sta.top() == 2)
printf("Rainy\n");
sta.pop();
}
}
return 0;
}

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. JavaScript操作DOM(动态表格处理)

    <html> <title>动态处理表格数据</title> <head> <script type="text/javascript& ...

  2. JS对象与PHP对象的对比

    一.对象的创建与访问 1.JS对象的创建与访问 //方式一(通过内置构造函数创建后添加属性) var obj = new Object(); obj.name = 'Lucy'; //通过点添加属性 ...

  3. mybatis逆向工程--自动生成实体代码(mybatis-generator)

    随便找个目录,  添加文件, 如图 主要是两个jar包,  generator的下载路径:   https://github.com/mybatis/generator/releases   驱动包随 ...

  4. Remon Spekreijse CSerialPort用法

    在程序中如果要用到多个串口,而且还要做很多复杂的处理,那么最好不用MSComm通讯控件,如果这时你还不愿意自己编写底层,就用这个类:CserialPort类.作者是 Remon Spekreijse ...

  5. 0x80070570 文件或目录损坏且无法读取 CHKDSK 修复方法

    错误 0x80070570: 文件或目录损坏且无法读取. 不要太担心是出现了磁盘坏道,也许只是小小的存储问题.解决方法很简单,用chsdsk命令即可. 方法如下: 开始--运行--输入cmd--输入c ...

  6. 【docker】docker基础原理,核心技术简介

    关于docker的核心技术,就是以下的三大技术: 1.namespaces [命名空间] 使用linux的命名空间实现的进程间隔离.Docker 容器内部的任意进程都对宿主机器的进程一无所知. 除了进 ...

  7. [翻译] 如何学习Cocoa

    [文章原地址]http://funwithobjc.tumblr.com/个人翻译,难免会有错误,请各位看官海涵,翻译在末尾本人将在文章的部分地方添加注释,并根据需求增减文章内容,在此对原作者辛勤劳作 ...

  8. FFMPEG视音频编解码零基础学习方法 【荐】

    在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频 编解码的人,有的已经是有多年经验的“大神”,有的是刚开始学习的初学者.在和大家探讨的过程中,我忽然发现了一个问题:在 ...

  9. 字符测试篇isalnum isalpha isascii iscntrl isdigit isgraphis islower isprint isspace ispunct isupper isxdigit

    isalnum(测试字符是否为英文或数字) 相关函数 isalpha,isdigit,islower,isupper 表头文件 #include<ctype.h> 定义函数 int isa ...

  10. 【BZOJ】【3675】【APIO2014】序列分割

    DP+斜率优化 首先我们根据这个分割的过程可以发现:总得分等于k+1段两两的乘积的和(乘法分配律),也就是说与分割顺序是无关的. 再对乘积进行重分组(还是乘法分配律)我们可以转化为:$ans=\sum ...