hdu 1493 qq宠物

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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值