第七天 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;
}
相关推荐
EterNity_TiMe_13 分钟前
【论文复现】(CLIP)文本也能和图像配对
python·学习·算法·性能优化·数据分析·clip
机器学习之心24 分钟前
一区北方苍鹰算法优化+创新改进Transformer!NGO-Transformer-LSTM多变量回归预测
算法·lstm·transformer·北方苍鹰算法优化·多变量回归预测·ngo-transformer
yyt_cdeyyds34 分钟前
FIFO和LRU算法实现操作系统中主存管理
算法
alphaTao1 小时前
LeetCode 每日一题 2024/11/18-2024/11/24
算法·leetcode
kitesxian1 小时前
Leetcode448. 找到所有数组中消失的数字(HOT100)+Leetcode139. 单词拆分(HOT100)
数据结构·算法·leetcode
VertexGeek2 小时前
Rust学习(八):异常处理和宏编程:
学习·算法·rust
石小石Orz2 小时前
Three.js + AI:AI 算法生成 3D 萤火虫飞舞效果~
javascript·人工智能·算法
jiao_mrswang3 小时前
leetcode-18-四数之和
算法·leetcode·职场和发展
qystca3 小时前
洛谷 B3637 最长上升子序列 C语言 记忆化搜索->‘正序‘dp
c语言·开发语言·算法
薯条不要番茄酱3 小时前
数据结构-8.Java. 七大排序算法(中篇)
java·开发语言·数据结构·后端·算法·排序算法·intellij-idea