Triangular Pastures POJ - 1948】的更多相关文章

Triangular Pastures POJ - 1948 sum表示木条的总长.a[i]表示第i根木条长度.ans[i][j][k]表示用前i条木条,摆成两条长度分别为j和k的边是否可能. 那么ans[i][j][k]=ans[i-1][j-a[i]][k] || ans[i-1][j][k-a[i]] 可以用滚动数组优化. 最后在ans[n]中枚举i和j,如果ans[n][i][j]为true,再算出sum-i-j的长度,判断是否存在分别以i,j,sum-i-j为三边长的三角形.如果存在,…
POJ1948 Triangular Pastures #include <iostream> #include <cmath> using namespace std; ; bool dp[maxn][maxn]; int a[maxn]; double area(double a, double b, double c) { ; return sqrt(p*(p-a)*(p-b)*(p-c)); } bool is_ok(int a, int b, int c) { if (a…
题目地址:http://poj.org/problem?id=1948 题目大意: 给N条边,把这些边组成一个三角形,问面积最大是多少?必须把所有边都用上. 解题思路: 根据题意周长c已知,求组合三边长使得三角形面积最大.如果直接DFS的话,每次考虑每根木棍放在哪一条边上,爆搜,可以加上每条边不会大于周长的一半的剪枝.根据数据规模,仍会超时,所以可以考虑采用动态规划.因为周长c已知,所以只需考虑其中两条边即可.类似二维0-1背包的做法,开一个二维判定数组f[i][j],i代表第一条边长为i,j为…
Description 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 triang…
题意:给出n条边,用这n条边构成一个三角形,求三角形的最大面积. 先求面积,用海伦公式,s=sqrt(p*(p-a)*(p-b)*(p-c)),其中a,b,c分别为三角形的三条边,p为三角形的半周长,同时由这个根式可以推出,三角形的任意一条边小于其半周长(根号里面大于0,如果等于0面积为0没有意义了) 所以考虑背包两条边,再用周长减去这两条边求出第三条边,再遍历一遍找出最大的三角形. dp[i][j]表示三角形的第一条边为i,第二条边为j所构成的三角形是否存在, 如果存在,dp[i][j]=1,…
题意: 把很多单独的线段重新组合成一个三角形,使得三角形面积最大(所有的线段都必须用上). 思路: 三角形的任意一条边的边长不能超过周长的一半,只需要用dp枚举两条边j,k,剩下的一条边长为tot  - j - k;判断枚举出的这三条边是否能组成三角形,用海伦公式求出面积 代码: #include <map> #include <set> #include <stack> #include <queue> #include <cmath> #in…
描述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 pastur…
题意:给出不多于40个小棍的长度,求出用所有小棍组成的三角形的最大面积. 思路:三角形3边求面积,海伦公式:p=(a+b+c)/2;S=p*(p-a)*(p-b)*(p-c);因为最大周长为1600  则三角形的边长小于周长一半800: 则可以用背包思想dp[i][j]代表能组成的两条边i和j.dp为true代表小棍能组成这两条边,第三条边也能求出,最后遍历一次dp数组求最大面积. 代码: #include<iostream> #include<cstring> #include&…
T了两发,DP方程很简单粗暴 dp[i][j][k]:用前i物品使得容量分别为j和k的背包恰好装满 背包的调用只需一次即可,第一次T就是每次check都丧心病狂地背包一次 对于sum的枚举,其实i j枚举到sum/2就可以了 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> #define scan(a) scanf(…
这道题我记得是携程比赛上的一道. 开始时想直接设面积,但发现不可以,改设能否构成三角形.设dp[i][j][k]为前i根木棍构成边长为j和k的三角形,那么转移可以为dp[i][j][k]=dp[i-1][j-len[i]][k]|dp[i-1][j][k-len[i]].当发现可以构成三角形时,再用海伦公式求出三角形面积即可. 由于边长不应该超过总长一半,所以,DP范围只在一半即可. #include <iostream> #include <cstdio> #include &l…