HDU 5135
题意略。
思路:
本题开始我先写了一发dfs暴力,然而递归程度太深,导致爆栈。仔细回想一下dfs的过程,发现最不好处理的就是每收集到3个木棍,才能构成一个三角形。
并且,还有一个隐患就是不能完全枚举出来木棍的组合情况。那么我们可以预先把木棍的组合情况枚举出来,按照题意,不会超过220种现在我们就是
想在这些组合情况中谋求最大面积。这样,我们可以把这个题看成为一个特殊的背包问题。
令dp[i][state]为在0~i中,当前恰好持有的木棍情况为state,且这些木棍要全部用完,我可以谋取的最大利益。那么状态转移方程为:
dp[i][state] = max(dp[i - 1][state],dp[i - 1][state - 当前方案所需木棍情况] + area);
详见代码:
- #include<bits/stdc++.h>
- #define maxn 251
- #define maxn1 5000
- using namespace std;
- struct node{
- double val;
- int state;
- node(double a = ,int b = ){
- val = a,state = b;
- }
- };
- double store[];
- node depot[maxn];
- double dp[][maxn1];
- int n;
- double cal(double a,double b,double c){
- double p = (a + b + c) / ;
- return sqrt(p * (p - a) * (p - b) * (p - c));
- }
- bool judge(double a,double b,double c){
- return (fabs(a - b) < c && c < a + b);
- }
- void depart(int s){
- for(int i = ;i < n;++i){
- if(s & (<<i)) printf("");
- else printf("");
- }
- }
- int main(){
- while(scanf("%d",&n) == && n){
- for(int i = ;i < n;++i) scanf("%lf",&store[i]);
- int tail = ;
- for(int i = ;i < n;++i){
- for(int j = i + ;j < n;++j){
- for(int k = j + ;k < n;++k){
- double a = store[i],b = store[j],c = store[k];
- if(!judge(a,b,c)) continue;
- depot[tail++] = node(cal(a,b,c),(<<i) | (<<j) | (<<k));
- }
- }
- }
- for(int i = ;i < ;++i){
- for(int j = ;j < maxn1;++j) dp[i][j] = -;
- }
- dp[][depot[].state] = depot[].val;
- dp[][] = ;
- int total = (<<n);
- for(int i = ;i < tail;++i){
- for(int s = ;s < total;++s){
- dp[i & ][s] = dp[(i - ) & ][s];
- if(depot[i].state != (s & depot[i].state) || dp[(i - ) & ][s - depot[i].state] == -) continue;
- dp[i & ][s] = max(dp[i & ][s],dp[(i - ) & ][s - depot[i].state] + depot[i].val);
- }
- }
- double ans = ;
- for(int s = ;s < total;++s){
- ans = max(ans,dp[(tail - ) & ][s]);
- }
- printf("%.2lf\n",ans);
- }
- return ;
- }
HDU 5135的更多相关文章
- [HDU 5135] Little Zu Chongzhi's Triangles (dfs暴搜)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5135 题目大意:给你n条边,选出若干条边,组成若干个三角形,使得面积和最大.输出最大的面积和. 先将边 ...
- hdu 5135 Little Zu Chongzhi's Triangles
http://acm.hdu.edu.cn/showproblem.php?pid=5135 题意:给你N个木棍的长度,然后让你组成三角形,问你组成的三角形的和最大是多少? 思路:先求出可以组成的所有 ...
- hdu 5135(2014广州—状态dp)
t题意:给你n条边,构造任意个三角形,一个三角形恰好只用3条边,每条边只能一次,求面积最大值 思路: 最开始想的是先排序从大到小取,但感觉并不怎么靠谱. 最多12条边,所以可以求出所有可能的三角形面积 ...
- 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 ...
- HDU 5135(再思考)
题意略. 思路:再思考后发现,为了构造出最大的三角形面积和,我们应该尽量让长的棍子相组合,这样构造出的三角形面积和最大,贪心能解. #include<bits/stdc++.h> usin ...
- hdu 1199 Color the Ball
http://acm.hdu.edu.cn/showproblem.php?pid=1199 Color the Ball Time Limit: 2000/1000 MS (Java/Others) ...
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
- hdu 4859 海岸线 Bestcoder Round 1
http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...
随机推荐
- 分组在re模块中的使用以及使用正则表达式的技巧
1.split:切割 使用split不会返回被切割的字符 import re ret = re.split("\d+","5as46asf46asf46a") ...
- 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 退出 ...
- 【iOS】使用 CocoaPods 导入文件没有提示
解决方法: 选择工程的 TAEGETS -> Build Settings, 找到 Search Paths 下的 User Header Search Paths选项,如图所示: 点击 “+” ...
- Java基础:数组Array转成List的几种方法
在编写Java程序中,经常要用的一个转换就是数组和List对象之间的互转. 最简单的方法就是遍历 数组,然后将数组元素依次添加进list中. 此方法略,虽然方法很简单,但总感觉这样的方法有点笨 第二种 ...
- Samba:基于公网 IP 的服务访问
写在前面的话 由于使用过程中,发现如果 Samba 只用于内网访问,同事在外面甚至其它不是一个网段的同事就无法访问了.这显然不符合我们最终的需求,最后没法,只能把访问部署到云服务器上面去,此时问题来了 ...
- [Spring cloud 一步步实现广告系统] 15. 使用开源组件监听Binlog 实现增量索引准备
MySQL Binlog简介 什么是binlog? 一个二进制日志,用来记录对数据发生或潜在发生更改的SQL语句,并以而进行的形式保存在磁盘中. binlog 的作用? 最主要有3个用途: 数据复制( ...
- 使用Jasypt对SpringBoot配置文件加密
# **前言** 在日前安全形势越来越严重的情况下,让我意识到在项目中存在一个我们经常忽略的漏洞,那就是我们的项目的配置文件中配置信息的安全,尤其是数据库连接的用户名和密码的安全.所以这里我们就需要对 ...
- JAVA基础知识(三):input.nextLine() 和input.next()
next()方法在读取内容时,会过滤掉有效字符前面的无效字符,对输入有效字符之前遇到的空格键.Tab键或Enter键等结束符,next()方法会自动将其过滤掉:只有在读取到有效字符之后,next()方 ...
- CSS等分布局方法
原文链接:http://caibaojian.com/css-equal-layout.html CSS等比例划分,在CSS布局中是比较重要的,下面分享几种常用方法和探讨一下兼容性. 一:浮动布局+百 ...
- jquery验证大全
jQuery验证及限制 绑定键盘监听事件 $(document).on("keypress", ".txt-valid-len", function (e) { ...