poj 1230 Pass-Muraille( 贪心 )

博客讲述了博主在解决POJ 1230问题中应用贪心算法的思路和遇到的挑战。问题要求找到移除最少数量的墙,使魔术师能在棋盘式场地的任意列表演。博主发现贪心策略可能存在问题,特别是在证明其正确性上。反思中意识到需要提升思维严谨性和数学基础,并分享了他人的解决方案,即从左向右扫描,移除影响每列合法性的最长连续墙。尽管能确保达到合法状态,但博主尚未找到证明解最优的方法。
摘要由CSDN通过智能技术生成

题意 :  有一块棋盘式的场地和一个魔术师,场地中有n道墙,魔术师一次最多能穿越k道墙。求移除最少数量的墙,使得魔术师可以在场地的任意一列表演都可以成功。

虽然自己感觉出这题应该用贪心来做,并且找到了一个自己看来很正确的贪心思路,也简单的证明了我的贪心策略的正确性,但还是WA了。

问题出在了哪,我觉得问题出在了第三个环节对贪心选择正确性的证明上。其一,我的证明太过简单,根本没考虑证明本身是否成立;其二,我太懒,这就导致我太过依赖Sample中的几个例子,即使自己找反例时,思维也不能摆脱样例的束缚,这也是导致最终证明失败的原因。

以后要锻炼自己思维的严谨性,另外也深切的感觉到自己的数学功底还需很大的提高;还有就是要勤奋,无论是思考,还是动手。


看了discuss别人的贪新策略,自己在总结一下。

用二维数组来表示场地

思路 : 从左向右扫描场地的每一列是否合法。若不合法,贪心的找出从该列起向右延伸最长的m道墙,移除这m道墙使得该列合法。

证明 : 

可以通过循环不变式证明这个方法确实可以达到一个合法的最终状态,但如何证明解是最优的还没有好办法。。

#include <iostream>
using namespace std;
const int White = 0;
int n, k;
int w, h;
short g[101][101];
int Greedy()
{
	int minCount = 0;
	for( int c = 0; c <= w; ++ c ) {
		// 扫描每一行,找出墙数num
		int num = 0;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值