JZYZOJ 1382 光棍组织 状压dp

http://172.20.6.3/Problem_Show.asp?id=1382

 
水得过分了,本来以为要用lzx学长的写法写,抱着试试看的想法写了个特暴力的dp+dfs,过了,真是。。。
 
代码
 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring>  
 4 #include<algorithm>  
 5 #include<cmath>  
 6 using namespace std;
 7 const int maxn=1<<16;
 8 int n;
 9 int a[maxn+10]={};
10 int f[maxn+10]={},tot;
11 int vis[20]={};
12 void dfs(int k,int num,int mm){
13     if(k<=0){
14         f[mm]=max(f[mm],f[mm-num]+f[num]);
15         return;
16     }
17     int x=1<<(vis[k]-1);
18     dfs(k-1,num,mm);
19     dfs(k-1,num+x,mm);
20 }
21 int main(){
22     scanf("%d",&n);
23     int ma=1<<n;
24     for(int i=1;i<ma;i++){
25         scanf("%d",&a[i]);
26         f[i]=a[i];
27     }int x1;
28     for(int i=1;i<ma;i++){
29         tot=0;
30         for(int j=1;j<=n;j++){
31             x1=1<<(j-1);
32             if((x1|i)==i)vis[++tot]=j;
33         }
34         dfs(tot,0,i);
35     }
36     cout<<f[ma-1]<<endl;
37     return 0;
38 }
View Code

 

posted @ 2017-11-05 11:51  鲸头鹳  阅读(118)  评论(0编辑  收藏  举报