hdu 4865 Peter's Hobby(DP)
2684 단어 dp
사고방식: 직접 dp를 하고 경로를 구하면 된다. dp[i][j]는 전날 i일이 모두 요구를 만족시켰고 다음날 날씨가 j일 확률을 나타낸다.전이 방정식을 모두 곱해야 하기 때문에 계산 과정의 중치가 매우 작을 수 있기 때문에 나는 log로 계산했다. 그러나 쓰지 않아도 된다. 한참을 웅크리고 나서야 단어를 잘못 베낀 것을 발견하고 어리석게 울었다.
코드:
#include<cstdio>
#include<iostream>
#include<string>
#include<cmath>
#include<set>
#include<map>
#include<queue>
#include<cstring>
#include<algorithm>
#define inf 0x3f3f3f3f
#define Inf 0x3FFFFFFFFFFFFFFFLL;
using namespace std;
typedef long long ll;
const int maxn=55;
double p[3][3]={{0.5,0.375,0.125},
{0.25,0.125,0.625},
{0.25,0.375,0.375}
};
double q[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}
};
char * weather[3]={(char*)"Sunny",(char*)"Cloudy",(char*)"Rainy"};
double dp[maxn][3];
int x[maxn],pa[maxn][3],ans[maxn];
int getx(char * s)
{
if(strcmp(s,"Dry")==0) return 0;
if(strcmp(s,"Dryish")==0) return 1;
if(strcmp(s,"Damp")==0) return 2;
return 3;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
char str[10];
int t,tcase=0,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%s",str);
x[i]=getx(str);
}
for(int i=1;i<=n;++i)
for(int j=0;j<3;++j)
dp[i][j]=log(0);
memset(pa,0,sizeof(pa));
dp[1][0]=log(0.63)+log(q[0][x[1]]);
dp[1][1]=log(0.17)+log(q[1][x[1]]);
dp[1][2]=log(0.20)+log(q[2][x[1]]);
for(int i=2;i<=n;++i)
{
for(int j=0;j<3;++j)
{
for(int k=0;k<3;++k)
{
double tmp=dp[i-1][k]+log(p[k][j])+log(q[j][x[i]]);
if(tmp>dp[i][j])
{
dp[i][j]=tmp;
pa[i][j]=k;
}
}
}
}
int pos=0;
for(int i=0;i<3;++i)
if(dp[n][i]>dp[n][pos]) pos=i;
ans[n]=pos;
for(int i=n-1;i>=1;--i)
{
pos=pa[i+1][pos];
ans[i]=pos;
}
printf("Case #%d:
",++tcase);
for(int i=1;i<=n;++i)
printf("%s
",weather[ans[i]]);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【경쟁 프로 전형적인 90문】008의 해설(python)의 해설 기사입니다. 해설의 이미지를 봐도 모르는 (이해력이 부족한) 것이 많이 있었으므로, 나중에 다시 풀었을 때에 확인할 수 있도록 정리했습니다. ※순차적으로, 모든 문제의 해설 기사를 들어갈 예정입니다. 문자열...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.