题意略。

思路:

本题开始我先写了一发dfs暴力,然而递归程度太深,导致爆栈。仔细回想一下dfs的过程,发现最不好处理的就是每收集到3个木棍,才能构成一个三角形。

并且,还有一个隐患就是不能完全枚举出来木棍的组合情况。那么我们可以预先把木棍的组合情况枚举出来,按照题意,不会超过220种现在我们就是

想在这些组合情况中谋求最大面积。这样,我们可以把这个题看成为一个特殊的背包问题。

令dp[i][state]为在0~i中,当前恰好持有的木棍情况为state,且这些木棍要全部用完,我可以谋取的最大利益。那么状态转移方程为:

dp[i][state] = max(dp[i - 1][state],dp[i - 1][state - 当前方案所需木棍情况] + area);

详见代码:

  1. #include<bits/stdc++.h>
  2. #define maxn 251
  3. #define maxn1 5000
  4. using namespace std;
  5.  
  6. struct node{
  7. double val;
  8. int state;
  9. node(double a = ,int b = ){
  10. val = a,state = b;
  11. }
  12. };
  13.  
  14. double store[];
  15. node depot[maxn];
  16. double dp[][maxn1];
  17. int n;
  18.  
  19. double cal(double a,double b,double c){
  20. double p = (a + b + c) / ;
  21. return sqrt(p * (p - a) * (p - b) * (p - c));
  22. }
  23. bool judge(double a,double b,double c){
  24. return (fabs(a - b) < c && c < a + b);
  25. }
  26. void depart(int s){
  27. for(int i = ;i < n;++i){
  28. if(s & (<<i)) printf("");
  29. else printf("");
  30. }
  31. }
  32.  
  33. int main(){
  34. while(scanf("%d",&n) == && n){
  35. for(int i = ;i < n;++i) scanf("%lf",&store[i]);
  36. int tail = ;
  37. for(int i = ;i < n;++i){
  38. for(int j = i + ;j < n;++j){
  39. for(int k = j + ;k < n;++k){
  40. double a = store[i],b = store[j],c = store[k];
  41. if(!judge(a,b,c)) continue;
  42. depot[tail++] = node(cal(a,b,c),(<<i) | (<<j) | (<<k));
  43. }
  44. }
  45. }
  46. for(int i = ;i < ;++i){
  47. for(int j = ;j < maxn1;++j) dp[i][j] = -;
  48. }
  49. dp[][depot[].state] = depot[].val;
  50. dp[][] = ;
  51. int total = (<<n);
  52. for(int i = ;i < tail;++i){
  53. for(int s = ;s < total;++s){
  54. dp[i & ][s] = dp[(i - ) & ][s];
  55. if(depot[i].state != (s & depot[i].state) || dp[(i - ) & ][s - depot[i].state] == -) continue;
  56. dp[i & ][s] = max(dp[i & ][s],dp[(i - ) & ][s - depot[i].state] + depot[i].val);
  57. }
  58. }
  59. double ans = ;
  60. for(int s = ;s < total;++s){
  61. ans = max(ans,dp[(tail - ) & ][s]);
  62. }
  63. printf("%.2lf\n",ans);
  64. }
  65. return ;
  66. }

HDU 5135的更多相关文章

  1. [HDU 5135] Little Zu Chongzhi's Triangles (dfs暴搜)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5135 题目大意:给你n条边,选出若干条边,组成若干个三角形,使得面积和最大.输出最大的面积和. 先将边 ...

  2. hdu 5135 Little Zu Chongzhi's Triangles

    http://acm.hdu.edu.cn/showproblem.php?pid=5135 题意:给你N个木棍的长度,然后让你组成三角形,问你组成的三角形的和最大是多少? 思路:先求出可以组成的所有 ...

  3. hdu 5135(2014广州—状态dp)

    t题意:给你n条边,构造任意个三角形,一个三角形恰好只用3条边,每条边只能一次,求面积最大值 思路: 最开始想的是先排序从大到小取,但感觉并不怎么靠谱. 最多12条边,所以可以求出所有可能的三角形面积 ...

  4. HDU 5135.Little Zu Chongzhi's Triangles-字符串 (2014ACM/ICPC亚洲区广州站-重现赛)

    Little Zu Chongzhi's Triangles Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 512000/512000 ...

  5. HDU 5135(再思考)

    题意略. 思路:再思考后发现,为了构造出最大的三角形面积和,我们应该尽量让长的棍子相组合,这样构造出的三角形面积和最大,贪心能解. #include<bits/stdc++.h> usin ...

  6. hdu 1199 Color the Ball

    http://acm.hdu.edu.cn/showproblem.php?pid=1199 Color the Ball Time Limit: 2000/1000 MS (Java/Others) ...

  7. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  8. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  9. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

随机推荐

  1. 分组在re模块中的使用以及使用正则表达式的技巧

    1.split:切割 使用split不会返回被切割的字符 import re ret = re.split("\d+","5as46asf46asf46a") ...

  2. centOS7启动apache,报错Caused by: java.net.UnknownHostException: wshCentOS:

    测试方法: ping 127.0.0.1 ping localhost 解决方案: vi /etc/hosts 把127.0.0.1和wshCentOS绑定就好 按 i 进入修改模式,按 esc 退出 ...

  3. 【iOS】使用 CocoaPods 导入文件没有提示

    解决方法: 选择工程的 TAEGETS -> Build Settings, 找到 Search Paths 下的 User Header Search Paths选项,如图所示: 点击 “+” ...

  4. Java基础:数组Array转成List的几种方法

    在编写Java程序中,经常要用的一个转换就是数组和List对象之间的互转. 最简单的方法就是遍历 数组,然后将数组元素依次添加进list中. 此方法略,虽然方法很简单,但总感觉这样的方法有点笨 第二种 ...

  5. Samba:基于公网 IP 的服务访问

    写在前面的话 由于使用过程中,发现如果 Samba 只用于内网访问,同事在外面甚至其它不是一个网段的同事就无法访问了.这显然不符合我们最终的需求,最后没法,只能把访问部署到云服务器上面去,此时问题来了 ...

  6. [Spring cloud 一步步实现广告系统] 15. 使用开源组件监听Binlog 实现增量索引准备

    MySQL Binlog简介 什么是binlog? 一个二进制日志,用来记录对数据发生或潜在发生更改的SQL语句,并以而进行的形式保存在磁盘中. binlog 的作用? 最主要有3个用途: 数据复制( ...

  7. 使用Jasypt对SpringBoot配置文件加密

    # **前言** 在日前安全形势越来越严重的情况下,让我意识到在项目中存在一个我们经常忽略的漏洞,那就是我们的项目的配置文件中配置信息的安全,尤其是数据库连接的用户名和密码的安全.所以这里我们就需要对 ...

  8. JAVA基础知识(三):input.nextLine() 和input.next()

    next()方法在读取内容时,会过滤掉有效字符前面的无效字符,对输入有效字符之前遇到的空格键.Tab键或Enter键等结束符,next()方法会自动将其过滤掉:只有在读取到有效字符之后,next()方 ...

  9. CSS等分布局方法

    原文链接:http://caibaojian.com/css-equal-layout.html CSS等比例划分,在CSS布局中是比较重要的,下面分享几种常用方法和探讨一下兼容性. 一:浮动布局+百 ...

  10. jquery验证大全

    jQuery验证及限制 绑定键盘监听事件 $(document).on("keypress", ".txt-valid-len", function (e) { ...