LightOJ1030-Discovering Gold-dp

11 篇文章 0 订阅

题目大意:有n个点,开始在1这个点,每次用筛子前进,每到达一个新的点,就把当前的点的金子收下,如果那个点>n就返回去重新抛,问你最后金子的期望是多少;

题目解析:概率dp,一开始一直想着从前面开始dp,肯定不可以因为时间复杂度太高,应该从后面开始dp,这样就是记忆化搜索了,时间复杂度会大大降低;

AC代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
double dp[110];
int a[110],n;
double dfs(int pos)
{
	if(dp[pos]!=-1.0)
		return dp[pos];
	int i,cnt=0;
	double ans=0;
	for(i=1;i<=6;i++)
	{
		if(pos+i<=n)
		{
			cnt++;
			ans+=dfs(pos+i);
		}
	}	
	dp[pos]=ans*(1.0/cnt)+a[pos];
	return dp[pos];
}
int main()
{
	int cas,c,i;
	scanf("%d",&cas);
	for(c=1;c<=cas;c++)
	{
		scanf("%d",&n);
		for(i=1;i<=n;i++)
		{
			scanf("%d",&a[i]);
		}
		for(i=1;i<=n;i++)
			dp[i]=-1.0;
		dp[n]=a[n];
		printf("Case %d: %.12lf\n",c,dfs(1));
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值