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)的概率,以及前一天晴天(阴天.雨天)而今天发生晴 ...
随机推荐
- 网络服务器搭建的那些事(PV QPS Throughput) 转载
一.前言: 从事后台sever开发的同学,代码开发完成之后,上线之前,总会进行各种黑盒白盒测试,压测.正确性测试... 而测试同学,会给开发同学一份测试报告,需要开发同学进行确认...问题来了,里面好 ...
- 配置主从Mysql
怎么安装mysql数据库,这里不说了,只说它的主从复制,步骤如下: 1.主从服务器分别作以下操作: 1.1.版本一致 1.2.初始化表,并在后台启动mysql 1.3.修改root的密码 2.修 ...
- [分享]2013:Linux的黄金之年-十大杰出成就
2013年已经过去.这一年见证了许多里程碑事件,使得2013年可以称得上是一个Linux的黄金之年.其中一些成果在FOSS和Linux世界更可以称得上是举世瞩目的成就. 1.Android的上升趋势 ...
- Notepad++源代码阅读——窗口元素组织与布局
1.1 前言 这两天在看notepad++ 1.0版本的源代码.看了许久终于把程序的窗口之间的关系搞清楚了现在把其组织的要点写于此,希望对大家有所帮助. 1.2 窗口元素之间的关系 Notepad++ ...
- 通过maven-war-plugin插件对war包分环境打包
针对多环节,从源头打包入手,当然这些都可以在运维阶段用脚本进行替换来代替 resources/environment/下有四个环境,local本地.dev开发.test测试.pre预上线.prod生产 ...
- 使用jQuery异步传递含复杂属性及集合属性的Model到控制器方法
Student类有集合属性Courses,如何把Student连同集合属性Courses传递给控制器方法? public class Student { public ...
- Ubuntu 查看本机的ip
打开终端中执行:ifconfig -a命令即可,如下图所示白色背景信息即是. 说明: enp0s3 表示第一块网卡, 其中 HWaddr 表示网卡的物理地址,可以看到目前这个网卡的物理地址(MAC地址 ...
- 3D几何图形生成的DEMO
3D几何图形生成的DEMO 可以生成以下几种图形: [1] 平面(Plane)图形的生成算法 [2] 立方体(Box)图形的生成算法 [3] 球(Sphere)图形的生成算法 [4] 圆锥(Cone) ...
- go语言基础之指针做函数参数用地址传递
1.指针做函数参数 示例: package main //必须有个main包 import "fmt" func swap(p1, p2 *int) { *p1, *p2 = *p ...
- Windows Server上iSCSI的Best Practices
Installing and Configuring Microsoft iSCSI Initiator http://technet.microsoft.com/en-us/library/ee33 ...