HDU 5135 Little Zu Chongzhi's Triangles (2014 ACM-ICPC广州站)

来源:互联网 发布:国外域名交易论坛 编辑:程序博客网 时间:2024/05/15 23:52

题目链接:题目

题目大意:给你N的数,求能组成所有三角行的面积和的最大值

解题思路:状态压缩dp,还没接触过dp,,,,感觉好难啊,,

我也不会写,说下思路把,就是枚举所有的状态,,其中三个一组,组成三角行,并且边不能重复用


#include<cstdio>#include<algorithm>#include<cstring>#include<cmath> using namespace std;const int maxn = 20;const int maxm = (1<<14);int a[maxn];double dp[maxm];struct Node{int choice;double S;}node[maxm];double area(int a,int b,int c){double p=(a+b+c)*1.0/2;return sqrt(p*(p-a)*(p-b)*(p-c));}int main(){int n;while(~scanf("%d",&n)&&n){memset(dp,0,sizeof(dp));for(int i=0;i<n;i++) scanf("%d",&a[i]);sort(a,a+n);int cnt=0;for(int i=0;i<(1<<n);i++){int tmp[maxn];int loc = 0;for(int j=0;j<n;j++){if(i&(1<<j)){tmp[loc++]=a[j];}}if(loc != 3 || tmp[0] + tmp[1] <=tmp[2]) continue;node[cnt].choice=i;node[cnt].S=area(tmp[0],tmp[1],tmp[2]);cnt++;}double ans=0;for(int i=0;i< (1<<n);i++){for(int j=0;j<cnt;j++){if((i & node[j].choice)==0){dp[i | node[j].choice] = max(dp[i|node[j].choice],dp[i]+node[j].S);ans=max(ans,dp[i|node[j].choice]);}}}printf("%.2lf\n",ans);}return 0;}


0 0