HDU 1518 Square——dfs 论一句话的重要性
来源:互联网 发布:传奇霸业转生13数据 编辑:程序博客网 时间:2024/05/16 10:35
题目链接点击打开链接
题意:给定一些长度,问这些长度能否拼成正方形。
思路:dfs。树的深度为3,每一次终点为边长。
这道题思路不难,重点在剪枝和优化上。
下图是我每次只改一句话,在virtual judge提交每次的运行时间,其中有一次逗比改错了。。。
论一句话的重要性啊!!!
AC代码
#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<iomanip>#include<algorithm>#include<cmath>using namespace std;int n,aver;int flag=0,a[50],vis[50];void dfs(int cnt,int len,int index){ if(len==aver) dfs(cnt+1,0,0); if(cnt==3)//只找3条边即可,剩下的一定能组成一条边 { flag=1; return; } if(flag) return;//不加这一句会TLE for(int i=index; i<n; i++) { if(!vis[i] && len+a[i]<=aver) { vis[i]=1; dfs(cnt,len+a[i],i+1); if(flag) return;//加不加效果一样。。。 vis[i]=0; if(len==0) return ;//这是神奇的一句话,加上从800ms到200ms。这句话表示在进行了一次从下标0到n-1的dfs后得不到一条符合的边,回溯回来,len为0,从下标0开始找不到之后就更不用找了,直接退出。 } }}int main(){ int t; scanf("%d",&t); while(t--) { memset(vis,0,sizeof(vis)); scanf("%d",&n); int sum=0; flag=0; for(int i=0; i<n; i++) { scanf("%d",&a[i]); sum+=a[i]; } aver=sum/4; if(sum%4!=0) printf("no\n");//剪枝 else { sort(a,a+n,greater<int>());//从大到小排序,时间从200ms到60ms if(a[0]>aver)//剪枝 { printf("no\n"); continue; } dfs(0,0,0); if(flag) printf("yes\n"); else printf("no\n"); } } return 0;}
0 0
- HDU 1518 Square——dfs 论一句话的重要性
- dfs hdu 1518 square
- hdu 1518 Square (DFS)
- hdu 1518 Square(dfs)
- 【DFS】hdu 1518 Square
- HDU-1518 Square(DFS)
- hdu 1518 Square(DFS)
- HDU 1518 Square(DFS)
- HDU 1518--Square(DFS)
- HDU 1518 Square(DFS)
- HDU 1518 Square(DFS)
- hdu 1518 Square(DFS)
- HDU--1518 -- Square [DFS深搜]
- HDU 1518 Square(DFS)
- hdu 1518 Square (DFS)
- hdu 1518 Square【DFS+剪枝】
- hdu 1518 Square(DFS)
- hdu 1518 Square(dfs)
- nutch-1.7-学习笔记(1)-org.apache.nutch.crawl.Injector.java-ToolRunner
- poj 3259 Wormholes (Bellman-ford)
- 替换空格
- Android开发之EditText属性详解
- error LNK2001: unresolved external symbol "public: static struct CRuntimeClass const CQQFace::classC
- HDU 1518 Square——dfs 论一句话的重要性
- wireshark数据包拦截过滤器使用
- oracle导入时提示表空间不存在的问题
- jsp ${param.属性}用法
- poj 2375
- 杭电2009真心不知道上个啥错误,又打一次就对了
- 《后会无期》首映 感受
- java学习笔记2
- 炉香一缕烟