HDU 4865 Peter's Hobby

来源:互联网 发布:辩证看待人工智能 编辑:程序博客网 时间:2024/05/20 10:23

题意:叶子的干湿程度会受到天气的影响。而昨天的天气会影响到今天的天气情况。给出干湿程度和天气影响的概率矩阵和前后天气影响的概率矩阵。

           给出连续几天叶子的观测情况,求这几天最可能的天气序列。

思路:隐式马尔科夫模型。DP。

           题中已经给出了今天的概率,我们可以通过两个矩阵来算出之后的每个最大概率以及该天气是由前一天的哪个天气的转移过来的。

           最后,先判断最后一天的天气情况,然后回溯即可

代码如下:

#include <cstdio>#include <cstring>#include <cmath>using namespace std;const int MAX = 55;const int INF = 0x3f3f3f3f;double t1[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 t2[3][3] = {0.5,0.375,0.125,                   0.25,0.125,0.625,                   0.26,0.375,0.375};// 0:sunny,1:cloudy,2:rainychar weather[3][8] = {"Sunny","Cloudy","Rainy"};double f[MAX][3];int pre[MAX][3];int path[MAX];int trans(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;}int main(void){    //freopen("input.txt","r",stdin);    int T;    scanf("%d", &T);    for(int Case = 1; Case <= T; ++Case)    {        printf("Case #%d:\n",Case);        int n;        scanf("%d", &n);        f[1][0] = 0.63;        f[1][1] = 0.17;        f[1][2] = 0.2;        for(int i = 1; i <= n; ++i){            char str[20];            scanf("%s",str);            int k = trans(str);            for(int j = 0; j < 3; ++j){                if(i == 1) f[i][j] = log(f[i][j]) +log(t1[j][k]);                else {                    f[i][j] = -INF;                    for(int v = 0 ;v < 3; ++v){                        double tmp =f[i-1][v] + log(t2[v][j]) + log(t1[j][k]);                        if( tmp > f[i][j]){                            f[i][j] = tmp;                            pre[i][j] = v;                        }                    }                }            }        }        int next = 0;        for(int i = 1; i < 3; ++i)            if(f[n][i] > f[n][next])                next = i;        for(int i = n; i >= 1; next = pre[i][next],i--)            //printf("%s\n",weather[next]);           path[i] = next;        for(int i = 1; i<= n; ++i)           printf("%s\n",weather[path[i]]);    }    return 0;}

0 0