2018.09.27 bzoj3029: 守卫者的挑战(概率dp)

本文介绍了一种使用概率动态规划解决背包问题的经典方法。通过定义状态f[i][j][k]表示在第i次挑战中,已获得j次胜利,且背包剩余空间为k的概率,实现了问题的有效求解。文章提供了完整的代码实现,并详细解释了如何处理三维数组中可能出现的负数下标问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门
概率dp经典题目。
直接 f [ i ] [ j ] [ k ] f[i][j][k] f[i][j][k]表示当前是第i次挑战,已经胜利了j次,目前的背包剩余空间是k。
然后用前面的转移后面的就行了。
注意第三维可能是负数,需要用一些技巧转化一下(比如把整个数组的下标向右平移)
代码:

#include<bits/stdc++.h>
#define N 205
using namespace std;
int n,l,K,a[N],tmp;
double p[N],f[2][205][605],ans;
inline int calc(int x){
	if(x<0)return x=max(-n,x),N+x;
	return x=min(n,x),N+x;
}
inline int read(){
	int ans=0,w=1;
	char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans*w;
}
int main(){
	n=read(),l=read(),K=read();
	for(int i=1;i<=n;++i)p[i]=read()/100.0;
	for(int i=1;i<=n;++i)a[i]=read();
	f[0][0][calc(K)]=1;
	for(int i=0;i<n;++i){
		memset(f[tmp^1],0,sizeof(f[tmp^1]));
		for(int j=0;j<=n;++j)
			for(int k=-n;k<=n;++k){
				f[tmp^1][j+1][calc(k+a[i+1])]+=f[tmp][j][calc(k)]*p[i+1];
				f[tmp^1][j][calc(k)]+=f[tmp][j][calc(k)]*(1-p[i+1]);
			}
		tmp^=1;
	}
	for(int i=l;i<=n;++i)for(int j=0;j<=n;++j)ans+=f[tmp][i][calc(j)];
	printf("%.6lf",ans);
	return 0;
}
基于Spring Boot搭建的一个多功能在线学习系统的实现细节。系统分为管理员和用户两个主要模块。管理员负责视频、文件和文章资料的管理以及系统运营维护;用户则可以进行视频播放、资料下载、参与学习论坛并享受个性化学习服务。文中重点探讨了文件下载的安全性和性能优化(如使用Resource对象避免内存溢出),积分排行榜的高效实现(采用Redis Sorted Set结构),敏感词过滤机制(利用DFA算法构建内存过滤树)以及视频播放的浏览器兼容性解决方案(通过FFmpeg调整MOOV原子位置)。此外,还提到了权限管理方面自定义动态加载器的应用,提高了系统的灵活性和易用性。 适合人群:对Spring Boot有一定了解,希望深入理解其实际应用的技术人员,尤其是从事在线教育平台开发的相关从业者。 使用场景及目标:适用于需要快速搭建稳定高效的在线学习平台的企业或团队。目标在于提供一套完整的解决方案,涵盖从资源管理到用户体验优化等多个方面,帮助开发者更好地理解和掌握Spring Boot框架的实际运用技巧。 其他说明:文中不仅提供了具体的代码示例和技术思路,还分享了许多实践经验教训,对于提高项目质量有着重要的指导意义。同时强调了安全性、性能优化等方面的重要性,确保系统能够应对大规模用户的并发访问需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值