HDU 5135 Little Zu Chongzhi's Triangles (2014 ACM-ICPC广州站)
题目链接:题目
题目大意:给你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; }