HDU 5135 Little Zu Chongzhi's Triangles(狀壓dp或者貪心)
題目大意:給你n個線段讓你任意組成三角形,求組出來的三角形的面積的和最大為多少。
解題思路:首先你得知道海倫公式:S = sqrt(p*(p-a)*(p-b)*(p-c)), p = (a+b+c)/2。
思路一:貪心,按照邊的長度進行排序,從大到小判斷如果可以構成三角形,就讓他構成三角形,這樣組成的三角形的面積和一定是最大的。
PS:經過別人hack資料發現貪心是有漏洞的,我竟然AC了啊,sad。。。
資料下面有:
4
799 400 400 400
狀壓才是王道啊!
思路二:狀壓dp,先暴力求出來所有可以組成的三角形對應的狀態和麵積,然後dp求解,狀態轉移公式是:dp[i|(f[j].xnum)] = max(dp[i|(f[j].xnum)], dp[i]+f[j].s)。就是我們將這個狀態加進來,比較一下取最優。
思路一程式碼:
const int maxn = 20;
double num[maxn];
double f[maxn];
int main()
{
int n;
while(~scanf("%d",&n) && n)
{
for(int i = 0; i < n; i++)
cin >>num[i];
double sum = 0.0;
sort(num, num+n);
for(int i = n-1; i >= 2; i--)
{
if(num[i] >= num[i-1]+num[i-2]) continue;
double p = (num[i]+num[i-1]+num[i-2])/2.0;
sum += sqrt(p*(p-num[i])*(p-num[i-1])*(p-num[i-2]));
i -= 2;
}
printf("%.2lf\n",sum);
}
}
思路二程式碼:
const int maxn = 1<<15;
struct node
{
double s;
int xnum;
}f[maxn];
double dp[maxn];
double num[maxn];
double p[10];
int main()
{
int n;
while(~scanf("%d",&n) && n)
{
for(int i = 0; i < n; i++)
cin >>num[i];
double sum = 0;
int cnt = 0;
for(int i = 0; i < (1<<n); i++)
{
int ans = 0;
for(int j = 0; j < n; j++)
if(i&(1<<j)) ans++;
if(ans != 3) continue;
ans = 0;
for(int j = 0; j < n; j++)
if(i&(1<<j)) p[ans++] = num[j];
sort(p, p+3);
if(p[2] >= p[0]+p[1]) continue;
double xp = 0.0;
for(int j = 0; j < ans; j++) xp += p[j];
xp /= 2.0;
f[cnt].xnum = i;
f[cnt++].s = sqrt(xp*(xp-p[0])*(xp-p[1])*(xp-p[2]));
}
memset(dp, 0, sizeof(dp));
for(int i = 0; i < (1<<n); i++)
{
for(int j = 0; j < cnt; j++)
{
if((i&f[j].xnum)) continue;
dp[i|f[j].xnum] = max(dp[i|f[j].xnum], dp[i]+f[j].s);
sum = max(sum, dp[i|f[j].xnum]);
}
}
printf("%.2lf\n",sum);
}
}
相關文章
- hdu4313 貪心並查集 || 樹形dp並查集
- hdu 3177Crixalis's Equipment(貪心)UI
- HDU 5067 Harry And Dig Machine(狀壓dp)Mac
- HDU 4550卡片遊戲(貪心)遊戲
- 狀壓 dp
- 狀壓DP
- HDU 5813 Elegant Construction (貪心)Struct
- hdu4268 multiset應用 貪心
- hdu5380 貪心+雙端佇列佇列
- HDU 1992Tiling a Grid With Dominoes(狀壓dp)
- Codeforces 453B Little Pony and Harmony Chest:狀壓dp【記錄轉移路徑】
- Codeforces 459E Pashmak and Graph:dp + 貪心
- hdu3001 狀態壓縮dp+三進位制
- POJ 2411 Mondriaan's Dream:網格密鋪類 狀壓dp
- hdu 1789 Doing Homework again(簡單貪心)AI
- 狀壓DP基礎入門
- HDU5630 Hiking(貪心+優先佇列)佇列
- LeetCode 55. 跳躍遊戲 ( 回溯 dp 貪心LeetCode遊戲
- 合理安排(狀壓dp,包括技巧)
- 貪心
- HDU 4252A Famous City(弱資料可以使用貪心)
- HDU 5303 Delicious Apples (貪心 列舉 好題)APP
- Codeforces 571B Minimization:dp + 貪心【前後相消】
- 狀壓 + 網路流 -- Escape HDU - 3605
- E - Remove Pairs(狀壓dp+博弈論)REMAI
- Educational Codeforces Round 167 (Rated for Div. 2) D(dp,貪心)
- 2014上海網路賽1004||hdu5045 contest【狀態壓縮dp】
- 反悔貪心
- Supermarket(貪心)
- 列舉子集+預處理最佳化dp+貪心視角轉化成可做dp
- HDU 5339 Untitled (狀態壓縮列舉)
- Uva-1633 Dyslexic Gollum(狀壓DP)Go
- CF 1029E Tree with Small Distances 樹形DP or 貪心
- 8.13(優先佇列貪心維護+打表找規律+對頂堆優先佇列+DFS減枝+貪心dp)佇列
- 貪心演算法——Huffman 壓縮編碼的實現演算法
- CF1039D You Are Given a Tree (樹形 dp + 貪心 + 根號分治)
- 演算法學習之路|狀態壓縮dp演算法
- bzoj 3812: 主旋律 [容斥原理 狀壓DP]