CodeForces 398B 概率DP 记忆化搜索

本文探讨了一种使用记忆化搜索解决具有复杂概率状态转移的动态规划问题的方法。通过实例分析,展示了如何将问题转化为右下角状态转移的问题,并最终求得最优解。文章深入解释了记忆化搜索的原理及其在解决此类问题中的应用价值。

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

题目:http://codeforces.com/contest/398/problem/B


有点似曾相识的感觉,记忆中上次那个跟这个相似的 我是用了 暴力搜索过掉的,今天这个肯定不行了,dp方程想了非常久也没有想出来,有点无从下手的感觉,最后还是尝试了一下记忆化搜索,以dp[0][0]为边界,dp[x][y]代表当前有x行y列没有彩色的 瓷砖,搜索起来思路还是非常清晰的,可惜最后那个 算期望公式给写错了,瞎了好久,做出以后看了一下别人的做法,确实有点难想到,把涂好的都放在右下角,这样就仅仅有四种情况了,瓷砖移动肯定是有影响的,后来理解了他们那意思是 划分西线把瓷砖划分到右下角去,这样 状态转移 事实上跟记忆化搜索的一模一样了,想不到那个转移,


int n,m;

int xx[20000 + 55],yy[20000 + 55];

double dp[2000 + 55][2000 + 55];

int cntx = 0,cnty = 0;

void init() {
	memset(xx,0,sizeof(xx));
	memset(yy,0,sizeof(yy));
	memset(dp,-1,sizeof(dp));
}

bool input() {
	while(cin>>n>>m) {
		cntx = cnty = n;
		for(int i=0;i<m;i++) {
			int x,y;
			scanf("%d %d",&x,&y);
			if(!xx[x])cntx--;
			if(!yy[y])cnty--;
			xx[x]++;
			yy[y]++;
		}
		return false;
	}
	return true;
}

double dfs(int nowx,int nowy) {
	if(dp[nowx][nowy] > -1.0 + eps)return dp[nowx][nowy];
	if(nowx == 0 && nowy == 0)return dp[nowx][nowy] = 0.00;
	double p = nowx * 1.0/n;
	double q = nowy * 1.0/n;
	double ans = 1.00;
	if(nowx != 0)ans += dfs(nowx - 1,nowy) * p * (1.0 - q);
	if(nowy != 0) ans += dfs(nowx,nowy - 1) * (1.0 - p) * q;
	if(nowx != 0 && nowy != 0)ans += dfs(nowx - 1,nowy - 1) * p * q;
	return dp[nowx][nowy] = ans/(1.00 - (1.0 - p) * (1.0 - q));
}

void cal() {
	double ans = dfs(cntx,cnty);
	printf("%.10lf\n",ans);
}

void output() {

}

int main() {
	while(true) {
		init();
		if(input())return 0;
		cal();
		output();
	}
	return 0;
}


资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值