hdu 4865 Peter's Hobby(概率dp)
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's Hobby(概率dp)的更多相关文章
- hdu 4865 Peter's Hobby(2014 多校联合第一场 E)
Peter's Hobby Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- hdu 4865 Peter's Hobby (隐马尔可夫模型 dp)
Peter's Hobby Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- hdu 4865 Peter's Hobby
Peter's Hobby Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- HDU 4865 Peter's Hobby(2014 多校联合第一场 E)(概率dp)
题意:已知昨天天气与今天天气状况的概率关系(wePro),和今天天气状态和叶子湿度的概率关系(lePro)第一天为sunny 概率为 0.63,cloudy 概率 0.17,rainny 概率 0.2 ...
- 2014多校第一场 E 题 || HDU 4865 Peter's Hobby (DP)
题目链接 题意 : 给你两个表格,第一个表格是三种天气下出现四种湿度的可能性.第二个表格是,昨天出现的三种天气下,今天出现三种天气的可能性.然后给你这几天的湿度,告诉你第一天出现三种天气的可能性,让你 ...
- HDU 4405:Aeroplane chess(概率DP入门)
http://acm.split.hdu.edu.cn/showproblem.php?pid=4405 Aeroplane chess Problem Description Hzz loves ...
- 2015多校第7场 HDU 5378 Leader in Tree Land 概率DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5378 题意:一棵n个节点的树.对其节点进行标号(1~n).求恰好存在k个节点的标号是其节点所在子树的最 ...
- HDU 4336 Card Collector(动态规划-概率DP)
Card Collector Problem Description In your childhood, do you crazy for collecting the beautiful card ...
- HDU 4865 Peter's Hobby(概率、dp、log)
给出2个影响矩阵,一个是当天天气对湿度的影响,一个是前一天天气对当天天气的影响. 即在晴天(阴天.雨天)发生Dry(Dryish.Damp.Soggy)的概率,以及前一天晴天(阴天.雨天)而今天发生晴 ...
随机推荐
- 读书笔记_Effective_C++_条款三十六:绝不重新定义继承而来的non-virtual函数
这个条款的内容很简单,见下面的示例: class BaseClass { public: void NonVirtualFunction() { cout << "BaseCla ...
- java泛型中的E,K,V,T,U,S
注释: java 泛型类型使用大写形式,且比较短,这是常见的 在java库中,使用变量 E 表示集合的元素类型 K 和 V 分别表示数据库表数据的键key和值value的类型 T(如果有需要还可以使用 ...
- (转)js中的hasOwnProperty和isPrototypeOf方法
hasOwnProperty:是用来判断一个对象是否有你给出名称的属性或对象.不过需要注意的是,此方法无法检查该对象的原型链中是否具有该属性,该属性必须是对象本身的一个成员.isPrototypeOf ...
- 小程序获取openid unionid session_key
.wxml <button bindtap="paytap">授权</button> .js Page({ paytap: function () { va ...
- Android开发点点滴滴——一些基础的但实用的知识(2)
1.onItemLongClick和onItemClick事件截取 当须要同一时候获得一个listview的条目长按事件(onItemLongClick)和点击事件(onItemClick)时,仅仅须 ...
- java基础学习总结——多态(动态绑定)
一.面向对象最核心的机制——动态绑定,也叫多态
- ASP.NET MVC中的Session以及处理方式
最近在ASP.NET MVC项目中碰到这样的情况:在一个controller中设置了Session,但在另一个controller的构造函数中无法获取该Session,会报"System.N ...
- Scheduled Jobs with Custom Clock Processes in Java with Quartz and RabbitMQ
原文地址: https://devcenter.heroku.com/articles/scheduled-jobs-custom-clock-processes-java-quartz-rabbit ...
- Struts2 无后缀action请求
如果将Struts2的filter-mapping配置成 <filter-mapping> <filter-name>struts2</filter-name> & ...
- 玩转rocketMQ
下载地址https://github.com/alibaba/RocketMQ 安装环境需要jdk,maven,git http://maven.apache.org/download.html