JZYZOJ 1382 光棍组织 状压dp

时间:2022-10-10 05:30:07

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

 
水得过分了,本来以为要用lzx学长的写法写,抱着试试看的想法写了个特暴力的dp+dfs,过了,真是。。。
 
代码
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=<<;
int n;
int a[maxn+]={};
int f[maxn+]={},tot;
int vis[]={};
void dfs(int k,int num,int mm){
if(k<=){
f[mm]=max(f[mm],f[mm-num]+f[num]);
return;
}
int x=<<(vis[k]-);
dfs(k-,num,mm);
dfs(k-,num+x,mm);
}
int main(){
scanf("%d",&n);
int ma=<<n;
for(int i=;i<ma;i++){
scanf("%d",&a[i]);
f[i]=a[i];
}int x1;
for(int i=;i<ma;i++){
tot=;
for(int j=;j<=n;j++){
x1=<<(j-);
if((x1|i)==i)vis[++tot]=j;
}
dfs(tot,,i);
}
cout<<f[ma-]<<endl;
return ;
}