hdu5135 状态压缩DP

来源:互联网 发布:mac 越狱工具 编辑:程序博客网 时间:2024/04/29 14:45

位运算左移的位数,位运算符的优先级,应该是老问题了

#include<cctype>#include<cmath>#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<string>#include<queue>#include<stack>#include<set>#include<map>#define REP(i,a,b) for (i=(a);i<=(b);i++)#define CLEAR(a) memset((a),0,sizeof((a)))using namespace std;typedef long long LL;const double pi = acos(-1.0);const int maxn=20,maxm=1<<13;const int inf=99999999;const float eps=1e-3;int n;int a[maxn];double dp[maxm];typedef pair<int,double> pr;vector<pr> vec;void init();void solve();void outp();double delta(int a,int b,int c){    if (a+b<=c||a-b>=c) return 0;    double p=(a+b+c)/2.0;    return sqrt(p*(p-a)*(p-b)*(p-c));}int main(){    n=1;    while(~scanf("%d",&n)&&n)        {            init();            solve();            outp();        }    return 0;}void solve(){    sort(a,a+n);    for(int i=0;i<n-2;i++)        for(int j=i+1;j<n-1;j++)            for(int k=j+1;k<n;k++)            {                if (i==j||i==k||j==k) continue;                int key=(1<<i)+(1<<j)+(1<<k);                vec.push_back(make_pair(key,delta(a[i],a[j],a[k])));            }    //for(int i=0;i<vec.size();i++)    //    cout<<vec[i].first<<' '<<vec[i].second<<endl;    for(int i=0;i<=(1<<n)-1;i++)        for(int j=0;j<vec.size();j++)    {        if ((i&vec[j].first)<1)        {            //cout<<(i|vec[j].first)<<' '<<dp[i]<<endl;            dp[i|vec[j].first]=max(dp[i|vec[j].first],dp[i]+vec[j].second);        }    }}void init(){    vec.clear();    memset(dp,0,sizeof(dp));    for(int i=0;i<n;i++)        scanf("%d",&a[i]);}void outp(){    printf("%.2lf\n",dp[(1<<n)-1]);}


0 0