HDU 5135 Little Zu Chongzhi's Triangles(狀態壓縮)

#include<cstdio>
#include<stack>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<math.h>
using namespace std;
struct p{
int  x;
int y;
int z;
double S;
}
point[232];
double dian[15];
int c;
double dp[10000];
double mianji(int a,int b,int c){
    double P=(a+b+c)/2.0;
    return sqrt(P*(P-a)*(P-b)*(P-c));
}
double max(double a,double b){
    if(a>b)
        return a;
    else
        return b;
}
int main(){
    //freopen("G://test.txt","r",stdin);
    int n,m,i,j,k;
    while(scanf("%d",&n)!=EOF&&n!=0){
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;++i){
            scanf("%lf",&dian[i]);
        }
        c=0;
        for(int i=1;i<=n;++i){
            for(int j=i+1;j<=n;++j){
                for(int k=j+1;k<=n;++k){
                    if(dian[i]+dian[j]>dian[k]&&dian[k]+dian[j]>dian[i]&&dian[i]+dian[k]>dian[j]){
                        point[c].x=i;
                        point[c].y=j;
                        point[c].z=k;
                        point[c++].S=mianji(dian[i],dian[j],dian[k]);
                    }
                }
            }
        }//處理點

        for(int i=0;i<c;++i){
            for(int j=0;j<=(1<<n)-1;++j){
                if(    ((j>>(point[i].x-1))%2==0)    &&((j>>(point[i].y-1))%2==0)    &&((j>>(point[i].z-1))%2==0)){
                    int X=(1<<(point[i].x-1))+(1<<(point[i].y-1))+(1<<(point[i].z-1));
                    dp[j+X]=max(dp[j]+point[i].S,dp[j+X]);
                    //printf("%d %d %d %lf %lf %lf %d\n",point[i].x,point[i].y,point[i].z,point[i].S,dp[i],dp[i+X],X);
                }
            }
        }
        double mm=0;
        //printf("%d\n",(1<<n)-1);
        for(int i=0;i<=(1<<n)-1;++i){
        if(dp[i]>mm)
            mm=dp[i];
        }
    printf("%.2lf\n",mm);

    }
    return 0;
}






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章