hdu5135 Little Zu Chongzhi's Triangles(状态压缩dp)

题目链接:点击打开链接

题意描述:给定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

hdu5135 Little Zu Chongzhi's Triangles(状态压缩dp)的相关文章

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

该题其实是个DP,可能数据比较水,队友排序后从大的开始取都过了.. 我们来说说正解,一开始其实我已经写出来了,只是有一个地方导致了一直在输出一个不是数字的值,赛后才发现是我用memset对一个double类型的数组清-1的原因   ,改了一下就对了 .    直接开一维数组,用二进制表示集合的方法来表示哪些木棍被选取了 . 很简单的状态压缩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

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

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].

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

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

hdoj 5125 Little Zu Chongzhi&#39;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

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

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

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