hdu 1493 QQpet exploratory park
概率dp
题目网址:
http://icpc.njust.edu.cn/Problem/Hdu/1493/
本来以为很简单,结果硬是坑了将近2小时才ac,妈耶~ 这样的话小学期课设就要挂了5555555~
想了半天才想起前天看的书上的一句话:memset按位初始化,我说怎么第二组数据出来的概率怎么不对劲! memset(z,0,10)只初始了10位,妈的,都怪我学术不精。
还是继续努力吧:
#include<iostream>
using namespace std;
double p[7] = { 0 }; // 存概率
int m[] = { 5,12, 22, 29, 33, 38, 42, 46, 50 ,55 }; //存固定点
double z[10] = {0}; //存10以内总的概率
double dp[61][15] = {0}; //存每走一步后的概率
int main()
{
int t;
cin >> t;
while (t--)
{
memset(p, 0, 7);
memset(dp, 0, sizeof(dp));
memset(z, 0, sizeof(z)); *// memset是按位初始化的!!!!切记!!!!*
for (int i = 1; i < 7; i++)
{
cin >> p[i]; dp[i][1] = p[i];
}
for (int k = 2; k <= 10; k++) { //从第二次扔开始循环
for (int j = 0; j <= 60; j++) {
for (int i = 1; (i < 7)&& (i <= j); i++) {
dp[j][k] += (dp[j - i][k - 1] * p[i]); // 状态转移方程,比较简单
}
}
}
for (int i = 0; i < 10; i++) // 因为到达每一步不是一定是第10步才到的,也可能是中间就到了,或者只能前十步之内到达的
{
for (int k = 1; k <=10; k++)
z[i] += dp[m[i]][k];
}
for (int i = 0; i < 10; i++)
printf_s("%d: %.1lf%%\n", m[i], 100*z[i]); // 输出格式,%.1表示输出一个小数位,
//lf表示输出double类型,%%相当于c++的\%
if(t) cout << endl; //题目要求
}
return 0;
}