题目链接

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

思路 : 定义第 i 天叶子湿度为hum[i]。第 i 天,天气为 j 的最大概率为dp[i][j]。wealea[i][j]表示天气为 i 叶子为j的概率,weawea[i][j]表示今天天气为 i 明天天气为j的概率,st[i]表示第一天天气为i的概率。pre[i][j]: 第i天,天气为j时,前一天最可能的天气 。fir[i]表示第1天天气为 i 的概率。

对于存在的叶子序列{a1,a2......an},存在一个天气序列{b1,b2......bn},那么总的概率dp[n][j]=max(fir[b1]*wealea[b1][a1]*weawea[b1][b2]*wealea[b2][a2]*......* weawea[bn-1][bn]*wealea[bn][an])。数据太小可能会丢失精度,所以可以用log将乘法转化成加法,即log()=log(fir[b1])+log(wealea[b1][a1])+log(weawea[b1][b2])+log(wealea[b2][a2])+......+log(weawea[bn-1][bn])+log(wealea[bn][an])。求log()的最大值对应的序列就是天气序列。

官方题解:

 //E
#include <cstdio>
#include <cstring>
#include <vector>
#include <iostream>
#include <string>
#include <algorithm>
#include <cmath> using namespace std ; string str ;
vector<int>vec ;
double wealea[][] = {{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 weawea[][] = {{0.5,0.375,0.125},{0.25,0.125,0.625},{0.25,0.375,0.375}} ;
double fir[] = {0.63,0.17,0.2} ;
double dp[][] ;
double f[][] ;
int pre[][] ;
int hum[] ; void solve()
{
for(int i = ; i < ; i++)
fir[i] = log(fir[i]) ;
for(int i = ; i < ; i++)
for(int j = ; j < ; j ++)
weawea[i][j] = log(weawea[i][j]) ;
}
void Init()
{
memset(pre,-,sizeof(pre)) ;
memset(f,,sizeof(f)) ;
for(int i = ; i < ; i++)
for(int j = ; j < ; j++)
dp[i][j] = - ;
vec.clear() ;
}
int main()
{
int T, n ;
cin >> T ;
solve() ;
for(int i = ; i <= T ; i++)
{
cin >> n ;
Init() ;
for(int j = ; j < n ; j++)
{
cin >> str ;
if(str == "Dry") hum[j] = ;
else if(str == "Dryish") hum[j] = ;
else if(str == "Damp") hum[j] = ;
else if(str == "Soggy") hum[j] = ;
}
for(int j = ; j < n ; j++)
{
double x = ;
for(int k = ; k < ; k++)
{
f[j][k] = wealea[k][hum[j]] ;
x += f[j][k] ;
}
for(int k = ; k < ; k++)
f[j][k] /= x ;
}
for(int j = ; j < n ;j++)
for(int k = ; k < ; k++)
f[j][k] = log(f[j][k]) ;
for(int j = ; j < ; j++)
dp[][j] = f[][j] + fir[j] ;
for(int j = ; j < n ; j ++)
for(int k = ; k < ; k++)//今天
for(int h = ; h < ; h++)//昨天
{
double x1 = dp[j-][h]+weawea[h][k]+f[j][k];
if(dp[j][k] < x1)
{
dp[j][k] = x1;
pre[j][k] = h;
}
}
double maxx = - ;
int s = ,e = n- ;
for(int j = ; j < ; j++)
{
if(dp[n-][j] > maxx)
{
maxx = dp[n-][j] ;
s = j ;
}
}
while(pre[e][s] != -)
{
vec.push_back(s) ;
s = pre[e][s] ;
e -- ;
}
vec.push_back(s) ;
cout << "Case #"<<i<<":"<<endl ;
for(int j = n- ; j >= ; j --)
{
if(vec[j] == ) cout<<"Sunny"<<endl ;
if(vec[j] == ) cout<<"Cloudy"<<endl ;
if(vec[j] == ) cout<<"Rainy"<<endl ;
}
}
return ;
}

2014多校第一场 E 题 || HDU 4865 Peter's Hobby (DP)的更多相关文章

  1. 2014多校第一场J题 || HDU 4870 Rating(DP || 高斯消元)

    题目链接 题意 :小女孩注册了两个比赛的帐号,初始分值都为0,每做一次比赛如果排名在前两百名,rating涨50,否则降100,告诉你她每次比赛在前两百名的概率p,如果她每次做题都用两个账号中分数低的 ...

  2. 2014多校第一场A题 || HDU 4861 Couple doubi

    题目链接 题意 : 有K个球,给你一个数P,可以求出K个值,(i=1,2,...,k) : 1^i+2^i+...+(p-1)^i (mod p).然后女朋友先取,再xp取,都希望赢,如果女朋友能赢输 ...

  3. 2014多校第一场 I 题 || HDU 4869 Turn the pokers(费马小定理+快速幂模)

    题目链接 题意 : m张牌,可以翻n次,每次翻xi张牌,问最后能得到多少种形态. 思路 :0定义为反面,1定义为正面,(一开始都是反), 对于每次翻牌操作,我们定义两个边界lb,rb,代表每次中1最少 ...

  4. 2014多校第一场D题 || HDU 4864 Task (贪心)

    题目链接 题意 : 用N台机器,M个任务,每台机器都有一个最大工作时间和等级,每个任务有一个需要工作时间和一个等级.如果机器完成一个任务要求是:机器的工作时间要大于等于任务的时间,机器的等级要大于等于 ...

  5. 2019年牛客多校第一场B题Integration 数学

    2019年牛客多校第一场B题 Integration 题意 给出一个公式,求值 思路 明显的化简公式题,公式是分母连乘形式,这个时候要想到拆分,那如何拆分母呢,自然是裂项,此时有很多项裂项,我们不妨从 ...

  6. 【2019多校第一场补题 / HDU6578】2019多校第一场A题1001Blank——dp

    HDU6578链接 题意 有一串字符串,仅由 {0,1,2,3}\{0, 1, 2, 3\}{0,1,2,3} 组成,长度为 nnn,同时满足 mmm 个条件.每个条件由三个整数组成:l.r.xl.r ...

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

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

  8. Card Hand Sorting 18中南多校第一场C题

    一.题意 随机给你一堆牌(标准扑克牌),之后让你按照: 第一优先规则:所有相同花色的在一起 第二优先规则:所有相同花色的必须按照升序或者降序排列 问,你最少要拿出多少张牌插入到其他的地方以维持这个状况 ...

  9. 15年多校第一场七题hdu5294

    要做这题,先要明白图的割,说白了就是 为了让原点无法到汇点要删几条边(之所以叫割,就是在图面上切一刀,减掉最小的边是原点和汇点成为两个集合),想到了割先放着一会用. 题中说只有沿最短路走才有可能追上, ...

随机推荐

  1. JavaScript高级程序设计之window对象

    在浏览器中window对象实现了JavaScript中的Global对象: window对象是最顶层的对象: 所有其他全局的东西都可以通过它的属性检索到. ; window.aa = ; // 所有全 ...

  2. JavaScript高级程序设计之原型对象

    构造函数.原型对象.构造器是一体的关系,同时产生: 实例中的隐藏属性__proto__指向原型对象: 原型对象是这四种关系的纽带. 原型对象是动态的,不论在何处变化,实例中可以立即体现出来. var ...

  3. Erlang generic standard behaviours -- gen_server module

    在分析完gen module (http://www.cnblogs.com/--00/p/4271386.html)之后,就可以开始进入gen_server 的主体module 了.gen_serv ...

  4. Swift 类构造器的使用

    Swift 中构造器需要遵循的规则还是很多的, 总结一下, 有以下规则: 调用相关 指定构造器必须调用它直接父类的指定构造器方法. 便利构造器必须调用同一个类中定义的其它初始化方法. 便利构造器在最后 ...

  5. VS2012 常用web.config配置解析之自定义配置节点

    在web.config文件中拥有一个用户自定义配置节点configSections,这个节点可以方便用户在web.config中随意的添加配置节点,让程序更加灵活(主要用于第三方插件的配置使用) 自定 ...

  6. 如何设置电脑的IP

    先找到自己的ip,在设置ip. 图1 图2 图3 图4 图5 图6

  7. 最基础的Hash

    type thash=^node; node=record state:longint; next:thash; end; var a,i:longint; p:thash; hash:..]of t ...

  8. 树的基本操作java版

    看了一下树的定义,一些基本的操作,遍历,获取节点数,获取深度等等..这里参考了西电版的数据结构,基本用的都是递归实现的. 很多说明代码中都有,每个方法我都测了一下,这里我把节点类BTreeNode作为 ...

  9. HTML统一资源定位器

    w3c 更好的解释 在OSGi in action中安装bundle时要加文本传输协议,要不然shell判断不出来

  10. OS X 使用技巧——轻松地调整窗口大小

    如果你想调整窗口大小,只需要把鼠标指针悬停在窗口边框上.当它变成双向箭头时,点击并拖动鼠标即可完成这一操作. 但在实际操作中,迅速把鼠标指针定位到边框上比较困难. 解决的办法是:在终端输入以下命令: ...