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

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

爱了鸭1!!!!!!!

解题:

(剪枝)

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

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

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

结果:

        return;

[dotcpp]金陵十三钗(DFS+剪枝)_第1张图片

AC code:

#include
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)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<

 

你可能感兴趣的:(深度优先,剪枝,算法)