博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 4277 USACO ORZ(Dfs)
阅读量:5050 次
发布时间:2019-06-12

本文共 1291 字,大约阅读时间需要 4 分钟。

题目:

 

题意:给你n个数,要你用光所有数字组成一个三角形,问能组成多少种不同的三角形

 

发现自己弱爆了。。。。Dfs()超级弱。。。。

 

分析:每个数字一定在其中一条边,所以枚举所有数字的位置。。3^15暴搜,根本不需要什么used[]。。。

到所有数字都用完后,即到出口的时候,除去相同的三角形,重要的剪枝:a<=b<=c(看起来像没什么用,但是这是关键),且a,b,c都不等于0,

然后a + b*sum +c*sum*sum来构造一个唯一值再用set来计算总个数。。。。。

 

不要小看一些不起眼的剪枝。。。。

 

 

#include
#include
#include
using namespace std;const int M = 15 + 10;int save[M];int sum;int n;set <__int64> s;//64位void Dfs(int a, int b, int c, int num) { if (num == n) { if (a > b || b > c || a > c)//最关键的剪枝。。。保证a<=b<=c减少下面语句的执行次数 { return ; } if (a && b && c && a + b > c)//保证不为0和能组成三角形 { s.insert(a + b * sum + c * sum * sum);//构造唯一值 } return; } Dfs(a + save[num + 1], b, c, num + 1); Dfs(a , b + save[num + 1], c, num + 1); Dfs(a , b, c + save[num + 1], num + 1);}int main() { //freopen("in.txt", "r", stdin); int t; scanf("%d", &t); while (t--) { scanf("%d", &n); sum = 0; for (int i = 1; i <= n; i++) { scanf("%d", save + i); sum += save[i]; } s.clear(); Dfs(0, 0, 0, 0); printf("%d\n", s.size()); } return 0;}

 

 

 

转载于:https://www.cnblogs.com/qiufeihai/archive/2012/09/10/2678914.html

你可能感兴趣的文章
C#线程入门
查看>>
CSS清除浮动方法
查看>>
JVM内存回收机制简述
查看>>
洛咕 P2480 [SDOI2010]古代猪文
查看>>
js-创建对象的几种方式
查看>>
JDK JRE Java虚拟机的关系
查看>>
2018.11.20
查看>>
word20161215
查看>>
12th week blog
查看>>
dijkstra (模板)
查看>>
python小记(3)
查看>>
编译Linux驱动程序 遇到的问题
查看>>
大型分布式网站架构技术总结
查看>>
HDU 1017[A Mathematical Curiosity]暴力,格式
查看>>
[算法之美] KMP算法的直观理解
查看>>
EntityFramework 性能优化
查看>>
【ASP.NET开发】菜鸟时期的ADO.NET使用笔记
查看>>
android圆角View实现及不同版本号这间的兼容
查看>>
OA项目设计的能力③
查看>>
Cocos2d-x3.0 文件处理
查看>>