【培训习题.动态规划】8.7pasture三角形牧场
Time Limit:1000MS Memory Limit:65536K
Total Submit:32 Accepted:6
Description
和所有人一样,奶牛喜欢变化。它们正在设想新造型的牧场。奶牛建筑师Hei想建造围有漂亮白色栅栏的三角形牧场。她拥有N(3≤N≤40)块木板,每块的长度Li(1≤Li≤40)都是整数,她想用所有的木板围成一个三角形使得牧场面积最大。
请帮助Hei小姐构造这样的牧场,并计算出这个最大牧场的面积。
Input
第1行:一个整数N
第2..N+1行:每行包含一个整数,即是木板长度。
Output
仅一个整数:最大牧场面积乘以100然后舍尾的结果。
如果无法构建,输出-1。
Sample Input
pasture.in
5
1
1
3
3
4
Sample Output
pasture.out
692
Hint
【样例解释】
692=舍尾后的(100×三角形面积),此三角形为等边三角形,边长为4。
Source
【培训习题.动态规划】8.7pasture三角形牧场
代码:
#include<stdio.h> #include<stdlib.h> #include<math.h> #include<stdbool.h> bool f[41][1601][1601]={false}; int pd(int a,int b,int c) { if(a+b>c&&a+c>b&&b+c>a)return 1; return 0; } double s(int a,int b,int c) { double p=(double)(a+b+c)/2; return sqrt(p*(p-a)*(p-b)*(p-c))*100; } int main() { //freopen("data11.in","r",stdin); //freopen("data.txt","w",stdout); int n,sum=0,j,k,i; double max=0.0,a1,a2; int a[50]={0}; scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%d",&a[i]); sum+=a[i]; } f[0][0][0]=true; for(i=1;i<=n;i++){ for(j=0;j<=sum/2+1;j++){ for(k=0;k<=sum/2+1;k++){ if(f[i-1][j][k]){ f[i][j+a[i]][k]=true; f[i][j][k+a[i]]=true; f[i][j][k]=true; if(pd(j+a[i],k,sum-j-a[i]-k)){ a1=s(j+a[i],k,sum-j-a[i]-k); if(a1>max)max=a1; } if(pd(j,k+a[i],sum-j-k-a[i])){ a2=s(j,k+a[i],sum-j-k-a[i]); if(a2>max)max=a2; } } } } } if((int)max<=0.0){ printf("-1\n"); return 0; } printf("%d\n",(int) max); //system("pause"); return 0; }
思路:
i为前几块,j一边,k二边。
然后dp就是递推。
优化:
1.可能有i推i-1会比较好
2.循环sum/2+1;
3.可以滚动数组。把i去掉的。