您的位置:首页 > 其它

hdu4865 Peter's Hobby

2015-07-14 14:03 225 查看
题目大意:已知N天的天气湿度   求出N天最可能的天气状况。其中当天的天气状况

                  与前一天的天气相关,当天的空气湿度与当前的天气状况相关。第一天

                  不同天气状况概率已经给出。

思路: 求出不同天气下该种天气湿度的概率   通过找到最大的概率可推知当前的天气

            状况      由于当前天气受前一天的影响    因此打表求出每一天不同天气状况之

            下对于空气湿度k的概率    之后可利用数组回溯找到对应天气状况

  

             假设dp[i][j] 为当前天气状况为i 时空气湿度为j时的概率 则         

             dp[i][j] = dp[i-1][k]*waether[k][m]*wep[m][j] 

             表示i-1天第k种天气状况的概率* 第i天m天气状况的转换概率*m天气下的空气湿度

           

            由于后一天受前一天的影响,所以每天的天气状况并不是对对应湿度概率最大的天气

           而是根据最后一天概率最大的天气往前推的最可能的天气

           

            类似的精度问题应该使用log()  

             

代码如下: 

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
double dp[4][5]={{0,0},{0,0.5,0.375,0.125},{0,0.25,0.125,0.625},{0,0.25,0.375,0.375}};
double wep[4][5]={{0,0},{0,0.6,0.2,0.15,0.05},{0,0.25,0.3,0.2,0.25},{0,0.05,0.10,0.35,0.50}};
int num[55];
int pre[55][5],ans[55];
void solve(int n)
{
double f[55][5]={-0.10000000};
f[1][1]=0.63*wep[1][num[1]];
f[1][2]=0.17*wep[2][num[1]];
f[1][3]=0.20*wep[3][num[1]];

for(int i=2;i<=n;i++){
for(int j=1;j<=3;j++){
double ma=-0.10000;
int ti=0;
for(int k=1;k<=3;k++){
double temp=f[i-1][k]*dp[k][j]*wep[j][num[i]];
if(ma<temp)
{ma=temp;ti=k;}
}
f[i][j]=ma,pre[i][j]=ti;
}
}
double ma=-0.10000;
int ti=-1;
for(int j=1;j<=3;j++)
if(f
[j]>ma){
ma=f
[j];
ti=j;
}
ans
=ti;
for(int j=n;j>=2;j--){
ans[j-1]=pre[j][ti];
ti=pre[j][ti];
}
return ;
}
int main()
{
int t,n,i,j,w;
char wet[10];
scanf("%d",&t);
for(i=1;i<=t;i++){
scanf("%d",&n);
getchar();
for(j=1;j<=n;j++){
gets(wet);
if(!strcmp(wet,"Dry"))
num[j]=1;
else if(!strcmp(wet,"Dryish"))
num[j]=2;
else if(!strcmp(wet,"Damp"))
num[j]=3;
else
num[j]=4;
}

solve(n);
printf("Case #%d:\n",i);
for(j=1;j<=n;j++){
if(ans[j]==1)
printf("Sunny\n");
else if(ans[j]==2)
printf("Cloudy\n");
else
printf("Rainy\n");
}
}
return 0;
}


   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: