[POJ] 1948 Triangular Pastures (DP)
题目地址:http://poj.org/problem?id=1948
题目大意:
给N条边,把这些边组成一个三角形,问面积最大是多少?必须把所有边都用上。
解题思路:
根据题意周长c已知,求组合三边长使得三角形面积最大。如果直接DFS的话,每次考虑每根木棍放在哪一条边上,爆搜,可以加上每条边不会大于周长的一半的剪枝。根据数据规模,仍会超时,所以可以考虑采用动态规划。因为周长c已知,所以只需考虑其中两条边即可。类似二维0-1背包的做法,开一个二维判定数组f[i][j],i代表第一条边长为i,j为第二条边长为j,则第三条边长为c-i-j,判定所有情况。最后验证即可。因为三角形每条边长不可能超过周长的一半,所以枚举i,j最大到c/2即可。最后注意结果小数部分不是四舍五入,而是直接截断的,所以可以利用强制转化。
DP代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
using namespace std;
const int N=*;
int f[N][N];
int a[],c=,n; int main()
{ scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
c+=a[i];
} memset(f,,sizeof(f));
f[][]=;
for(int i=;i<=n;i++){
for(int j=c/+;j>=;j--){
for(int k=c/+;k>=;k--){
if(j-a[i]>= && f[j-a[i]][k]){
f[j][k]=;
}
if(k-a[i]>= && f[j][k-a[i]]){
f[j][k]=;
}
}
}
} double s=;
for(int i=c/+;i>=;i--){
for(int j=c/+;j>=;j--){
if(f[i][j]){
double la=i,lb=j,lc=c-i-j;
double p=(la+lb+lc)/2.0;
if(sqrt(p*(p-la)*(p-lb)*(p-lc))>s){
s=sqrt(p*(p-la)*(p-lb)*(p-lc));
}
}
}
} printf("%d\n",s== ? - : (int)(s*)); return ;
}
DFS代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
using namespace std;
const int N=;
int n,sum,la=,lb=,c=,lc;
int a[N],f[N];
double s=; void dfs(int k)
{
if(la>c/ || lb>c/ || lc>c/) return ;
if(k==n){
if(la+lb>lc && la+lc>lb && lb+lc>la){
double p=(la+lb+lc)/2.0;
if(sqrt(p*(p-la)*(p-lb)*(p-lc))>s){
s=sqrt(p*(p-la)*(p-lb)*(p-lc));
}
}
return ;
}
for(int i=;i<n;i++){
if(!f[i])
for(int j=;j<;j++){
if(j==){
la+=a[i];
f[i]=;
dfs(k+);
f[i]=;
la-=a[i];
}
if(j==){
lb+=a[i];
f[i]=;
dfs(k+);
f[i]=;
lb-=a[i];
}
if(j==){
lc+=a[i];
f[i]=;
dfs(k+);
f[i]=;
lc-=a[i];
}
}
}
}
int main()
{
memset(f,,sizeof(f));
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d",&a[i]);
c+=a[i];
}
dfs();
printf("%d\n",s== ? -:(int)(s*));
return ;
}
[POJ] 1948 Triangular Pastures (DP)的更多相关文章
- poj 1948 Triangular Pastures 小结
Description Like everyone, cows enjoy variety. Their current fancy is new shapes for pastures. The o ...
- POJ 1948 Triangular Pastures【二维01背包】
题意:给出n条边,用这n条边构成一个三角形,求三角形的最大面积. 先求面积,用海伦公式,s=sqrt(p*(p-a)*(p-b)*(p-c)),其中a,b,c分别为三角形的三条边,p为三角形的半周长, ...
- POJ 1948 Triangular Pastures
题意: 把很多单独的线段重新组合成一个三角形,使得三角形面积最大(所有的线段都必须用上). 思路: 三角形的任意一条边的边长不能超过周长的一半,只需要用dp枚举两条边j,k,剩下的一条边长为tot ...
- Triangular Pastures POJ - 1948
Triangular Pastures POJ - 1948 sum表示木条的总长.a[i]表示第i根木条长度.ans[i][j][k]表示用前i条木条,摆成两条长度分别为j和k的边是否可能. 那么a ...
- POJ1948 Triangular Pastures
POJ1948 Triangular Pastures #include <iostream> #include <cmath> using namespace std; ; ...
- POJ.3624 Charm Bracelet(DP 01背包)
POJ.3624 Charm Bracelet(DP 01背包) 题意分析 裸01背包 代码总览 #include <iostream> #include <cstdio> # ...
- POJ 2995 Brackets 区间DP
POJ 2995 Brackets 区间DP 题意 大意:给你一个字符串,询问这个字符串满足要求的有多少,()和[]都是一个匹配.需要注意的是这里的匹配规则. 解题思路 区间DP,开始自己没想到是区间 ...
- POJ 1948 DP
题意:给你n个木棍(n<=40)每个木棍长度<=40,问用上所有的木棍拼成的三角形的面积的最大值,并输出面积*100的值(不四舍五入) 如果没有解,输出-1. 思路: 背包判断可达性. f ...
- Triangular Pastures (二维01背包)
描述Like everyone, cows enjoy variety. Their current fancy is new shapes for pastures. The old rectang ...
随机推荐
- Java---IO加强(2)
转换流 ★转换流功能1:充当字节流与字符流之间的桥梁 需求:模拟英文聊天程序,要求: (1) 从键盘录入英文字符,每录一行就把它转成大写输出到控制台: (2) 保存聊天记录到字节流文件. 要求1的设计 ...
- 自定义VIew——漂亮的圆形进度条
package com.example.firstapp; import java.text.DecimalFormat; import android.annotation.SuppressLint ...
- 基本 vi 命令
前言 本文内容翻译 Basic vi Command, Colorado State University, 翻译原文的大部分内容. 本文介绍的是 UNIX 下的 vi 编辑器,和 Linux 下常用 ...
- uploadify在struts2下的使用
1.首先准备uploadify上传插件包,拷贝到项目目录下 2.注意其中的特殊文件:uploadify-init.js文件,是包含了封装后的特殊函数: /** * uploadify上传插件相关JS ...
- 在SQL中使用自定义函数
由于数据库的一个表字段中多包含html标签,现在需要修改数据库的字段把html标签都替换掉.当然我可以通过写一个程序去修改,那毕竟有点麻烦.直接在查询分析器中执行,但是MS SQL Server并 ...
- OpenGL —— 基础笔记
1.基础博文 链接:http://blog.csdn.net/lotusone?viewmode=contents 2.绘制文字 链接:http://www.cnblogs.com/xia ...
- JS~字符串长度判断,超出进行自动截取(支持中文)
今天一个小弟问我的问题,在文本框中输入字符,如果超出指定长度,就把它截取,要求中文等于两个字符的长度,我找一下资料,把这个功能实现了,下面是JS代码: <html> <script ...
- python常用的一些东西——sys、os等
1.常用内置函数:(不用import就可以直接使用) help(obj) 在线帮助, obj可是任何类型 callable(obj) 查看一个obj是不是可以像函数一样调用 ...
- C语言判断文件是否存在
用函数access,头文件是io.h,原型: int access(const char *filename, int amode); amode参数为0时表示检查文件的 ...
- python复制--笔记
对象引用: >>> songs = ["Bee","Core","Love"] >>> bat = so ...