USACO ORZ(DFS+set去重)
链接
2、题目描述

Like everyone, cows enjoy variety. Their current fancy is new shapes for pastures. The old rectangular shapes are out of favor; new geometries are the favorite.

I. M. Hei, the lead cow pasture architect, is in charge of creating a triangular pasture surrounded by nice white fence rails. She is supplied with N fence segments and must arrange them into a triangular pasture. Ms. Hei must use all the rails to create three sides of non-zero length. Calculating the number of different kinds of pastures, she can build that enclosed with all fence segments.

Two pastures look different if at least one side of both pastures has different lengths, and each pasture should not be degeneration.

输入

The first line is an integer T(T<=15) indicating the number of test cases.

The first line of each test case contains an integer N. (1 <= N <= 15)

The next line contains N integers li indicating the length of each fence segment. (1 <= li <= 10000)

输出

For each test case, output one integer indicating the number of different pastures.

样例输入

1

3

2 3 4

样例输出

1

题目大意
给定N个围栏,形成多少个不同的三角形,要求是N个围栏全部用上。这里不同的三角形指的是最少有一条边不同。

题解
深度优先搜索DFS(int a,int b,int c, int step,int n,int nums[])
形参是三条边a,b,c(要求a<=b<=c,方便处理)step是添加第step个围栏,n是全部围栏数量,nums是围栏长度数组。

深搜的循环节如下,意思是深搜的下一次决策可能是下面的某一种。

 //把第step个围栏加到最短的边上DFS(a+nums[step],b,c,step+1,n,nums);//把第step个围栏加到次短的边上DFS(a,b+nums[step],c,step+1,n,nums);//把第step个围栏加到最长的边上DFS(a,b,c+nums[step],step+1,n,nums);

那退出条件呢?
当然是step==n,所用围栏数等于围栏总数。满足我们三角形的假设:三条边a,b,c满足两边之和大于第三边a+b>c(要求a<=b<=c,方便处理),此处采用小技巧,把a,b,c三个变量通过多项式乘法(ac02+bc0+c)(ac_0^2+bc_0+c)(ac02​+bc0​+c) 转换成为一个唯一变量,这样用集合set统计个数即可。
注意这里c0不能乱取,太小的话容易造成重复,c0应该大一点,这里取数组中所有元素之和。
上代码

if(step==n){//满足三角形的基本条件if(a<=b&&b<=c&&a!=0&&b!=0&&c!=0&&a+b>c)//要保存到set中ans.insert(a*c0*c0+b*c0+c);return;//返回别忘记!}

深搜的调用DFS(0,0,0,0,N,a);意思是三条边从0开始,a=0,b=0,c=0,step表示第0条围栏,N表示围栏总数目,a表示存放围栏长度的数组。

全部代码

#include<iostream>
#include<set>
#include<algorithm>
using namespace std;int T,N,a[20];
//不能使用数组,这样有边重复
set<int> s;
set<int> ans; int c0=0;
void DFS(int a,int b,int c,int step,int n,int nums[]){if(step==n){if(a<=b&&b<=c&&a!=0&&b!=0&&c!=0&&a+b>c)ans.insert(a*c0*c0+b*c0+c);return;}DFS(a+nums[step],b,c,step+1,n,nums);DFS(a,b+nums[step],c,step+1,n,nums);DFS(a,b,c+nums[step],step+1,n,nums);}int main(){cin>>T;while(T--){ans.clear();cin>>N;for(int i=0;i<N;i++){cin>>a[i];c0+=a[i];//s.insert(a[i]);//放到集合中,没有重复 }DFS(0,0,0,0,N,a);cout<<ans.size()<<endl;}}

当然上述代码没有记录具体的解决方案,即每条边的取值。

HDU-4277USACO ORZ深搜+set去重相关推荐

  1. J - 数塔 HDU - 2084(深搜,记忆化搜索+)

    在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 已经告诉你了,这是个DP的题目 ...

  2. HDU 6264 (深搜,数论)

    题目链接 题意 求\(\sum_{d|n}\phi (d) \times {n\over d}\),其中\(\phi(n) = n\prod_{p|n}({1-{1\over p}})\) 分析 将\ ...

  3. hdu 1312深搜入门题

    2019独角兽企业重金招聘Python工程师标准>>> Red and Black Problem Description There is a rectangular room, ...

  4. hdu 3812 Sea Sky 深搜+剪枝

    题目意思: 从sea 找一条道sky 的最长路 题解: 先进行一系列的预处理 1.将所有不重复的字符串先保留下来,然后从小到大排序,这样深搜的时候最先弄出来的答案就是最小的 字母序. 2. 进行深度优 ...

  5. 骑士精神(双向深搜+meet in the middle)

    题目描述 在一个5×55×55×5的棋盘上有121212个白色的骑士和121212个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为111,纵坐标相差为22 ...

  6. 深搜、广搜、搜索剪枝

    搜索与回溯讲解 文章目录 深搜 方向向量: DFS代码: 题目讲解: 八皇后问题 字符序列 自然数的拆分 广搜 BFS代码: 题目讲解: 瓷砖 关系网络 bfs与dfs的用途与区别 搜索剪枝 可行性剪 ...

  7. 深入递归、深搜dfs、回溯、剪纸学习。

    深入递归,深搜dfs,回溯,剪枝 参考于博客 一.双管齐下解递归 "逐步生成结果"类问题之数值型 自下而上的递归(递推,数学归纳,动态规划) 解决简单情况下的问题. 推广到稍复杂情 ...

  8. 深搜(DFS)和宽搜(BFS)

    相同点: 深搜和宽搜都可以对空间进行遍历,搜索的结构都是树 不同点: 深搜(DFS):(暴搜)(直男)(执着的人) (1)尽可能往深了搜,当搜到叶节点(简称搜到头)就会回溯,然后再搜下一个,然后再回溯 ...

  9. hdu1667The Rotation Game 迭代深搜IDA*

    题目链接:http://acm.hdu.edu.cn/data/images/1667-1.jpg 题目是这个棋盘里面摆放着8个1,8个2和8个3,每一步你可以沿着A.B. C.D.E.F.G.H任意 ...

最新文章

  1. echart 多柱图只显示部分数据标签_2分钟上手、3小时学会无代码软件开发---Echarts数据可视化...
  2. 力的作用与形态的分类
  3. Matlab | Matlab从入门到放弃(3)——函数与画图
  4. 解决点击MDI父窗体下拉菜单,子窗体重复出现的问题
  5. 使用air进行移动app开发常见功能和问题(二)
  6. matlab里用fix函数,Matlab基本函数-fix函数
  7. ViewPager与Tab结合使用
  8. Resource Hacker+mysql安装会出现错误“应用程序无法启动因为应用程序的并行配置不正确”...
  9. socket io 不使用redis_为什么Redis单线程能够达到数十万、百万级的QPS?
  10. 《音频、图像及视频技术》学习笔记
  11. socket编程(七)
  12. delphi if多个条件_【会计职场】老会计带你玩转Excel,IF函数的使用方法大全!小白必看!...
  13. 【C++】C++中你不了解的类型转换
  14. linux ssh-keygen命令生成密钥 -t -C参数说明
  15. C Primer Plus 第6版第二章的作业
  16. Linux快捷键及命令
  17. Ansys Lumerical Zemax Speos | CMOS 传感器相机:3D 场景中的图像质量分析
  18. html个人主题制作,个人网页制作
  19. 毕业设计 基于STM32停车管理系统 - 物联网
  20. ArcGIS地图制图教程——超详细

热门文章

  1. NSPredicate的用法
  2. jquery 获得鼠标指针 X/Y 值
  3. .Net Discovery系列之十一-深入理解平台机制与性能影响 (中)
  4. centos7输入shell找不到命令_反弹shell原理与实现
  5. python爬取b站粉丝数_【python爬虫】每天统计一遍up主粉丝数!
  6. vs2017python找不到包_关于Python在VS2017版中编译C源代码出现的各种问题解决方法...
  7. TensorFlow 资源汇集
  8. (1 24) 3 java代码_算24点 java代码
  9. 1.1 为什么选择序列模型-深度学习第五课《序列模型》-Stanford吴恩达教授
  10. STM32 进阶教程 18 – ADC间断模式