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. mysql 5.6 与5.7安装

    http://blog.itpub.net/29733787/viewspace-1590891/ http://www.oschina.net/code/snippet_7933_45700

  2. golang 字符串与整数, 布尔转换 strconv

    strconv 是golang对于字符串和基本数据类型之间的转换字符串转整数testStr := "1000" testInt, err := strconv.Atoi(testS ...

  3. 用资源管理器右键编译 Visual Studio 解决方案文件

    每次改动 VC 工程之后都要重新编译,每次 VS 又会生成调试数据库文件,很费时间,于是研究了一下如何在资源管理器中直接编译,还真发现了解决办法. 以下是适用 Visual Studio 2008 的 ...

  4. C#程序集系列03,引用多个module

    我们经常在项目中引用程序集.通常情况下,一个程序集包含一个module,但一个程序集也可以包含多个module.本篇就来体验:在一个可以被编译成.exe可执行文件的.cs文件中引用多个module. ...

  5. 用最简单的例子理解策略模式(Strategy Pattern)

    当一个动作有多种实现方法,在实际使用时,需要根据不同情况选择某个方法执行动作,就可以考虑使用策略模式. 把动作抽象成接口,比如把玩球抽象成接口. public interface IBall { vo ...

  6. 聊聊JVM的年轻代(转)

    聊聊JVM的年轻代 本文转自http://ifeve.com/jvm-yong-generation/ 1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代 ...

  7. org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection

    org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection 这个问题困扰许久,许久 ...

  8. ACM-DP之最大连续子序列——hdu1231

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  9. [MAC OS] XCode中的Debug View Hierarchy功能

    reference to : http://blog.csdn.net/liujinlongxa/article/details/46490949 前言 做iOS开发经常会遇见这种情况,产品汪拿着你做 ...

  10. OpenShift上部署Redis主从集群

    客户有部署有状态服务的需求,单机部署模式相对简单,尝试一下集群部署. 关于Redis的master,slave 以及sentinal的架构和作用不提,有兴趣可以参考之前的博客 https://www. ...