题目链接:HDU 5131 Little Zu Chongzhi‘s Triangles
题意:给出一些线段,在其中选出3根组成三角形,问用这些线段组成的所有三角形的最大面积是多少。
7
3 4 5 3 4 5 90
两个三角形是(3,3,4),(5,5,4)。
思路:N最大12,状态压缩,把所有可能组成的三角形存起来。A&B==0则说明A|B状态是有效的。
贪心也能过。。为什么?
AC代码:
#include <stdio.h> #include <string.h> #include <math.h> #include <vector> #include <algorithm> using namespace std; const int maxn=1<<12; bool ok(int a,int b,int c) { if(a+b>c) return true; return false; } double Area(int a,int b,int c) { double p=(a+b+c)*1.0; p/=2; return sqrt(p*(p-a)*(p-b)*(p-c)); } double dp[maxn]; int a[20]; vector<int> v; int main() { int n,st,i,j,k; while(scanf("%d",&n)!=EOF,n) { v.clear(); for(i=0; i<n; i++) scanf("%d",&a[i]); memset(dp,0.0,sizeof dp); sort(a,a+n); for(i=0; i<n; i++) { for(j=i+1; j<n; j++) { for(k=j+1; k<n; k++) { if(ok(a[i],a[j],a[k])) { st=(1<<i)|(1<<j)|(1<<k); dp[st]=Area(a[i],a[j],a[k]); v.push_back(st); } } } } for(i=0; i<(1<<n); i++) { if(dp[i]==0) continue; for(j=0; j<v.size(); j++) { if(!(i&v[j])) dp[i|v[j]]=max(dp[i],dp[i]+dp[v[j]]);//i到i|v[j] } } double ans=0; for(i=0; i<(1<<n); i++) ans=max(ans,dp[i]); printf("%.2lf\n",ans); } return 0; }
HDU 5131 Little Zu Chongzhi's Triangles (状压DP +2014广州现场赛)
时间: 2024-12-12 10:01:53