hdoj 5125 Little Zu Chongzhi's Triangles【状态压缩dp】

题目:hdoj 5125 Little Zu Chongzhi‘s Triangles

题意:给出n个木棍的长度,然后问这些木棍所能组成三角形的最大面积。

分析:这个题目用状态压缩解,因为木棍的最大个数为12

我们枚举所有状态,用状态对应位的 0 和 1 表示这个木棍是否选择,然后如果某个状态选择的木棍是3的话,判断是否可以组成,可以的话dp【st】 = 三角形面积

然后大于三的,分解之后得出转移方程dp【st】 = max(dp【st】,dp【i】 + dp【st - i】) (i | (st - i)== st)

AC代码:

#include <stdio.h>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
const int N = 15;

bool Judge(double a,double b,double c)
{
    if((a+b)>c && (a+c)>b && (b+c)>a)
        return true;
    return false;
}
double Solve(double a,double b,double c)
{
    double p = (a+b+c)/2.0;  //zhuyi
    return sqrt(p*(p-a)*(p-b)*(p-c));
}
double a[N],dp[1<<N];
vector<int> v;
int main()
{
    int n;
    while(~scanf("%d",&n) && n)
    {
        for(int i=0;i<n;i++)
        {
            scanf("%lf",&a[i]);
        }
        memset(dp,0,sizeof(dp));
        for(int st = 1 ;st < (1<<n); st++)
        {
            for(int i=0;i<n;i++)
            {
                if(st&(1<<i))
                    v.push_back(i);
            }
            if(v.size()==3)
            {
                if(Judge(a[v[0]],a[v[1]],a[v[2]]))
                    dp[st] = max(dp[st],Solve(a[v[0]],a[v[1]],a[v[2]]));
            }
            for(int i = 0;i<st;i++)
            {
                if((i|(st-i))==st) //与的运算符优先级低
                    dp[st] = max(dp[st],dp[i]+dp[st-i]);
            }
            v.clear();
        }
        printf("%.2lf\n",dp[(1<<n)-1]);
    }
    return 0;
}

hdoj 5125 Little Zu Chongzhi's Triangles【状态压缩dp】

时间: 2025-01-06 09:10:26

hdoj 5125 Little Zu Chongzhi's Triangles【状态压缩dp】的相关文章

HDOJ 5135 Little Zu Chongzhi&#39;s Triangles 状压DP

状压DP Little Zu Chongzhi's Triangles Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others) Total Submission(s): 88    Accepted Submission(s): 49 Problem Description Zu Chongzhi (429–500) was a prominent Chinese mathemat

hdu 5135 Little Zu Chongzhi&#39;s Triangles 状压DP

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5135 从大到小贪心是不对的! 比如 4 30 40 50 89 这组数据 结果应该是600 如果取后三条边只会是一个细长细长的三角形根本没多大面积 只不过因为数据水然后贪心碰巧能过而已 看到网上题解很多人用贪心我好郁闷... 状压DP 看到边的数目很少就应该想到这个了 先枚举可能出现的所有三角形 记录他们使用了那些边还有他们的面积 然后再枚举状态之中 套一层遍历所有三角形的循环 如果当前状态和三角形

HDU 5131 Little Zu Chongzhi&#39;s Triangles (状压DP +2014广州现场赛)

题目链接: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> #

HDU 5135 Little Zu Chongzhi&#39;s Triangles(状压dp或者贪心)

题目大意:给你n个线段让你任意组成三角形,求组出来的三角形的面积的和最大为多少. 解题思路:首先你得知道海伦公式:S = sqrt(p*(p-a)*(p-b)*(p-c)), p = (a+b+c)/2. 思路一:贪心,按照边的长度进行排序,从大到小判断如果可以构成三角形,就让他构成三角形,这样组成的三角形的面积和一定是最大的. 思路二:状压dp,先暴力求出来所有可以组成的三角形对应的状态和面积,然后dp求解,状态转移公式是:dp[i|(f[j].xnum)] = max(dp[i|(f[j].

Codeforces Gym 100015F Fighting for Triangles 状态压缩DP

F Fighting for Triangles Description Andy and Ralph are playing a two-player game on a triangular board that looks like the following: 1 234 5 7 86 910 11 13 14 16 1712 15 18 At each turn, a player must choose two adjacent vertices and draw a line se

HDU 5135 Little Zu Chongzhi&#39;s Triangles(状态压缩dp+Vector)

这道题是水题,当时直接贪心就过了. 多阶段决策,其实应该用dp,他人的代码使用Vector进行预处理. #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<vector> using namespace std; int n, a[12]; double dp[1<<12]; double cal(int a, int b, i

hdu5135 Little Zu Chongzhi&#39;s Triangles(状态压缩dp)

题目链接:点击打开链接 题意描述:给定n(3=<n<=12)节木棍,从中选取一些组成多个三角形,每个三角形由3节木棍组成.问组成的三角形面积之和最大为多少? 解题思路: 刚开始暴力搜索发现当n=12时最多可以组成4个三角形,如果暴力搜索O(4^12==2^24)果断tle 所以考虑动态规划,由于n最大为12所以我们可以用二进制 表示是否要某节木棍.先预处理出每种可能的三角形,然后动态规划即可 代码: #include <cstdio> #include <cmath>

UVALive 7077 Little Zu Chongzhi&#39;s Triangles (有序序列和三角形的关系)

这个题……我上来就给读错了,我以为最后是一个三角形,一条边可以由多个小棒组成,所以想到了状态压缩各种各样的东西,最后成功了……结果发现样例过不了,三条黑线就在我的脑袋上挂着,改正了以后我发现N非常小,想到了回溯每个棍的分组,最多分5组,结果发现超时了……最大是5^12 =  244,140,625,厉害呢…… 后来想贪心,首先想暴力出所有可能的组合,结果发现替换问题是一个难题……最后T T ,我就断片了.. 等看了别人的办法以后,我才发现我忽视了三角形的特性,和把数据排序以后的特点. 如果数据从

hdu5135 Little Zu Chongzhi&#39;s Triangles(DP)

该题其实是个DP,可能数据比较水,队友排序后从大的开始取都过了.. 我们来说说正解,一开始其实我已经写出来了,只是有一个地方导致了一直在输出一个不是数字的值,赛后才发现是我用memset对一个double类型的数组清-1的原因   ,改了一下就对了 .    直接开一维数组,用二进制表示集合的方法来表示哪些木棍被选取了 . 很简单的状态压缩DP . 另外需要注意一点: 位运算符的优先级比较低,所以在不确定的情况下要多加括号 ~ 我用的记忆化搜索,该题还可以用三重循环地推的方式求 . 细节参见代码