题目地址: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)的更多相关文章

  1. poj 1948 Triangular Pastures 小结

    Description Like everyone, cows enjoy variety. Their current fancy is new shapes for pastures. The o ...

  2. POJ 1948 Triangular Pastures【二维01背包】

    题意:给出n条边,用这n条边构成一个三角形,求三角形的最大面积. 先求面积,用海伦公式,s=sqrt(p*(p-a)*(p-b)*(p-c)),其中a,b,c分别为三角形的三条边,p为三角形的半周长, ...

  3. POJ 1948 Triangular Pastures

    题意: 把很多单独的线段重新组合成一个三角形,使得三角形面积最大(所有的线段都必须用上). 思路: 三角形的任意一条边的边长不能超过周长的一半,只需要用dp枚举两条边j,k,剩下的一条边长为tot  ...

  4. Triangular Pastures POJ - 1948

    Triangular Pastures POJ - 1948 sum表示木条的总长.a[i]表示第i根木条长度.ans[i][j][k]表示用前i条木条,摆成两条长度分别为j和k的边是否可能. 那么a ...

  5. POJ1948 Triangular Pastures

    POJ1948 Triangular Pastures #include <iostream> #include <cmath> using namespace std; ; ...

  6. POJ.3624 Charm Bracelet(DP 01背包)

    POJ.3624 Charm Bracelet(DP 01背包) 题意分析 裸01背包 代码总览 #include <iostream> #include <cstdio> # ...

  7. POJ 2995 Brackets 区间DP

    POJ 2995 Brackets 区间DP 题意 大意:给你一个字符串,询问这个字符串满足要求的有多少,()和[]都是一个匹配.需要注意的是这里的匹配规则. 解题思路 区间DP,开始自己没想到是区间 ...

  8. POJ 1948 DP

    题意:给你n个木棍(n<=40)每个木棍长度<=40,问用上所有的木棍拼成的三角形的面积的最大值,并输出面积*100的值(不四舍五入) 如果没有解,输出-1. 思路: 背包判断可达性. f ...

  9. Triangular Pastures (二维01背包)

    描述Like everyone, cows enjoy variety. Their current fancy is new shapes for pastures. The old rectang ...

随机推荐

  1. UVAlive3713 Astronauts(2-SAT)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18511 [思路] 2-SAT. 设分得A或B类任务为1 C类任务为 ...

  2. 终于有人把O2O、C2C、B2B、B2C的区别讲透了

    一.O2O.C2C.B2B.B2C的区别在哪里? o2o 是 online to offline 分为四种运营模式 1.online to offline 是线上交易到线下消费体验 2.offline ...

  3. driver.startActivity 启动app出现 An unknown server-side error occurred while processing the command

    driver.startActivity("com.xxx.module.xxx", "com.xxx.module.xxx.hibox.ui.entry.EntryAc ...

  4. Union和Union All的差别

    如果我们有一个表Student,包含下面字段与数据: drop table student; create table student ( id int primary key, name nvarc ...

  5. C语言单元測试

    C语言单元測试 对于敏捷开发来说,单元測试不可缺少,对于Java开发来说,JUnit非常好,对于C++开发,也有CPPUnit可供使用,而对于传统的C语言开发,就没有非常好的工具可供使用,能够找到的有 ...

  6. [Flexbox] Using flex-direction to layout content horizontally and vertically

    The Flexbox css spec allows for more adjustable layouts. The flex-directionproperty allows you to ea ...

  7. NYOJ-744蚂蚁的难题(一)

    这个题都说是水题,楞是没做出来,看了好多题解,感觉这个规律没看懂,后来在讨论区看到了一个题解,感觉有点懂了,写一下自己的理解 首先要明白异或的意思,简单一句话: 同0异1,既然这样,让求区间a,b 中 ...

  8. DataGrid 使用模型列后实现点击列名称排序

    DataGrid 使用模型列后实现点击列名称排序 代码如下: <DataGridTemplateColumn Header="型 号" SortMemberPath=&quo ...

  9. css之z-index深度解析

    (几个重点概念解析) 一.层叠上下文 层叠上下文:如果一个元素拥有层叠上下文.那么就代表这个元素在页面的z轴上是有定位的. 什么元素拥有 层叠上下文:a.根元素.b.z-index值为数值的元素.c. ...

  10. CSS3 过滤

    CSS3 过滤 通过CSS3,我们可以在不适用flash动画或JavaScript的情况下,当元素从一种样式变换为另一种样式时为元素添加效果. 浏览器支持 属性 浏览器支持 transition   ...