第七天 dfs剪枝&优化

第七天 dfs剪枝&优化

1可行性剪枝

2最优性剪枝

3重复性剪枝

1

输入

5 5 6

...S.

XX.X.

...X...

...D.X

...X...

输出

YES


题解

cpp 复制代码
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 10;
int n,m,T;
char mat[N][N];
bool vis[N][N];
int dx[4] = {0,0,-1,1};
int dy[4] = {1,-1,0,0};
bool ok;
void dfs(int x,int y,int t){
	if(ok){
		return;
	}
	if(t == T){
		if(mat[x][y] == 'D'){
			ok = true;
		}
		return;
	}
	vis[x][y] = true;
	for(int i = 0;i<4;i++){
		int tx = x + dx[i];
		int ty = y + dy[i];
		if(tx<0 || tx >=n || ty<0 || ty>=m || mat[tx][ty] == 'X'|| vis[tx][ty]){
			continue;
		}
		dfs(tx,ty,t+1);
	}
	vis[x][y] = false;
}
int main(){
	cin >>n>>m>>T;
	for(int i = 0;i<n;i++){
		cin >>mat[i];
	}
	int sx,sy,ex,ey;
	for(int i = 0;i<n;i++){
		for(int j = 0;j<m;j++){
			if(mat[i][j] == 'S'){
				sx = i;
				sy = j;
			}
			if(mat[i][j] == 'D'){
				ex = i;
				ey = j;
			}
		}
	}
	if((sx+sy+ex+ey+T) % 2 != 0){
		cout <<"NO"<<endl;
	}else{
		ok = false;
		dfs(sx,sy,0);
		if(ok){
			cout <<"YES"<<endl;
		}else{
			cout <<"NO"<<endl;
		}
	}
	return 0;
} 

2

7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为N*pi的M层生日蛋糕,每层都是一个圆柱体。

设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱。当i < M时,要求Ri > Ri+1且Hi > Hi+1。

由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小。

令Q = S*pi

请编程对给出的N和M,找出蛋糕的制作方案(适当的Ri和Hi的值),使S最小。

(除Q外,以上所有数据皆为正整数)

Input:

有两行,第一行为N(N <= 10000),表示待制作的蛋糕的体积为Nπ;第二行为M(M <= 20),表示蛋糕的层数为M。

Output:

仅一行,是一个正整数S(若无解则S = 0)。

Time Limit:1000MS Memory Limit: 10000K

Sample Input

100

2

样例输出

68


题解

cpp 复制代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
int n,m;
int ans;
int vs[20];
void dfs(int u,int v,int s,int r0,int h0){  //当前层数 当前体积 当前表面积 半径上界 高上界 
	if(u == m){
		if(v == n){
			ans = min(ans,s);
		}
		return;
	}
	if(va[m-u]+v>n){
		return;
	}
	if(2.0*(n-v)/r0 +s >ans){
		return;
	}
	for(int r = r0;r>=m-u;r--){
		for(int h = h0;h>=m-u;h--){
			int tv = v+r*r*h;
			if(tv > n)
				continue;
			int ts = s+2*r*h;
			if(u == 0){
				ts += r*r;
			}
			dfs(u+1,tv,ts,r-1,h-1);
		}
	}
	 
}
int main(){
	cin >>n>>m;
	for(int i = 1;i<=m;i++){
		va[i] = va[i-1]+i*i*i;
	}
	int r0 = sqrt(n) + 0.5;
	ans = INF;
	dfs(0,0,0,r0,n);
	if(ans == INF){
		ans = 0;
	}
	cout <<ans<<endl;
	return 0;
}

3

全排列

题解

cpp 复制代码
#include<iostream>
#include<cstdio>
using namespace std;
int ans,n;
bool vis[50];
void dfs(int cnt,int num){ //列举的第几个数字 输出的数 
	if(cnt == n){
		cout <<num<<endl;
		return;
	}
	for(int i = 1;i<=n;i++){
		if(!vis[i]){
			vis[i] = true;
			dfs(cnt+1,num*10+i);
			vis[i] = false;
		}
	}
}
int main(){
	cin >>n;
	ans = 1;
	for(int i = 1;i<=n;i++){
		ans *= i;
	}
	cout <<ans<<endl;
	dfs(0,0);
	return 0;
}
相关推荐
小码农<^_^>几秒前
优选算法精品课--滑动窗口算法(一)
算法
羊小猪~~3 分钟前
神经网络基础--什么是正向传播??什么是方向传播??
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
软工菜鸡28 分钟前
预训练语言模型BERT——PaddleNLP中的预训练模型
大数据·人工智能·深度学习·算法·语言模型·自然语言处理·bert
南宫生31 分钟前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
AI视觉网奇1 小时前
sklearn 安装使用笔记
人工智能·算法·sklearn
JingHongB1 小时前
代码随想录算法训练营Day55 | 图论理论基础、深度优先搜索理论基础、卡玛网 98.所有可达路径、797. 所有可能的路径、广度优先搜索理论基础
算法·深度优先·图论
weixin_432702261 小时前
代码随想录算法训练营第五十五天|图论理论基础
数据结构·python·算法·深度优先·图论
小冉在学习1 小时前
day52 图论章节刷题Part04(110.字符串接龙、105.有向图的完全可达性、106.岛屿的周长 )
算法·深度优先·图论
Repeat7151 小时前
图论基础--孤岛系列
算法·深度优先·广度优先·图论基础
小冉在学习1 小时前
day53 图论章节刷题Part05(并查集理论基础、寻找存在的路径)
java·算法·图论