题目链接:点击打开链接
题意描述:给定n(3=<n<=12)节木棍,从中选取一些组成多个三角形,每个三角形由3节木棍组成。问组成的三角形面积之和最大为多少?
解题思路:
刚开始暴力搜索发现当n=12时最多可以组成4个三角形,如果暴力搜索O(4^12==2^24)果断tle
所以考虑动态规划,由于n最大为12所以我们可以用二进制 表示是否要某节木棍。先预处理出每种可能的三角形,然后动态规划即可
代码:
#include <cstdio> #include <cmath> #include <iostream> #include <vector> using namespace std; double getarea(double x,double y,double z){ double l=(x+y+z)/2; return sqrt(l*(l-x)*(l-y)*(l-z)); } double istrangle(double x,double y,double z){ if(x+y<=z||x+z<=y||y+z<=x) return false; return true; } int n,d[12]; double dp[1<<12]; vector<int> vc; int main(){ while(scanf("%d",&n)==1&&n!=0){ for(int i=0;i<n;++i) scanf("%d",&d[i]); int tsize=1<<n; for(int i=0;i<tsize;++i) dp[i]=0; vc.clear(); for(int i=0;i<n;++i){ for(int j=i+1;j<n;++j){ for(int k=j+1;k<n;++k){ if(istrangle(d[i],d[j],d[k])){ int st=(1<<i|1<<j|1<<k); dp[st]=getarea(d[i],d[j],d[k]); vc.push_back(st); } } } } int num=vc.size(); for(int i=0;i<tsize;++i){ for(int j=0;j<num;++j){ if(i&vc[j]) continue; dp[i|vc[j]]=max(dp[i|vc[j]],dp[i]+dp[vc[j]]); } } printf("%.2lf\n",dp[tsize-1]); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
hdu5135 Little Zu Chongzhi's Triangles(状态压缩dp)
时间: 2024-10-28 19:36:08