[dotcpp]金陵十三钗(DFS+剪枝)

文章讲述了如何利用深度优先搜索(DFS)结合剪枝策略来优化解题过程。在遍历过程中,当当前搜索路径上的最大值加上剩余层数的最大值小于已知的最佳结果时,通过剪枝避免无效计算,提高效率。代码示例展示了在二维数组问题中应用这一策略的过程。

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

逐渐领悟dfs暴搜的真谛,配上一定的剪枝是真的优雅

爱了鸭1!!!!!!!

解题:

(剪枝)

记录一个最大值,如果当前搜索过程中的最大值 + 剩下层数 * maxv <= res  

则不可能更新最大值  , 直接return
    故只需要加一句剪枝代码:

    if (s + (n - x + 1) * maxv <= res)

结果:

        return;

AC code:

#include<iostream>
using namespace std;
const int N=15;
int n,a[N][N],res,mmax;
bool vis[N];
void dfs(int num,int sum) {

	//剪枝
	if(sum+mmax*(n-num+1)<res) { //在遍历到num层已有sum相似度和,尽管接下来每层都选最大值还是比res(目前整体最大相似度和小)
		//就return;
		return ;
	}
	if(num>n) { //结束
		res=max(res,sum);
		return;
	}
	for(int j=1; j<=n; j++) { //第num行的所有列
		if(vis[j])continue;//该列已经被选
		vis[j]=true;
		dfs(num+1,sum+a[num][j]);
		vis[j]=false;//回溯

	}
}
int main() {
	cin>>n;
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=n; j++) {
			cin>>a[i][j];
			mmax=max(mmax,a[i][j]);//dfs中剪枝用的
		}
	}
	dfs(1,0);
	cout<<res<<"\n";
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值