[状压dp][dfs] Jzoj P2679 跨时代
作者:互联网
题解
- 数据范围这么小,显然就是状压先处理出能构成的长度
- 然后用dfs找到等宽的两组就好了
代码
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 using namespace std; 5 int n,ans,f[2000],g[1<<17],len[20]; 6 void dp(int sum,int x) 7 { 8 if (sum&1) return; 9 memset(f,0,sizeof(f)),f[0]=1; 10 for (int i=0;i<n;i++) if (x&1<<i) for (int j=sum;j>=len[i];j--) if (f[j-len[i]]) f[j]=1; 11 if (f[sum>>1]) g[x]=1; 12 } 13 void dfs(int k,int x1,int sum1,int x2,int sum2) 14 { 15 if (k==n) 16 { 17 if (g[x1]&&g[x2]) ans=max(ans,sum1*sum2/4); 18 return; 19 } 20 dfs(k+1,x1,sum1,x2,sum2),dfs(k+1,x1+(1<<k),sum1+len[k],x2,sum2),dfs(k+1,x1,sum1,x2+(1<<k),sum2+len[k]); 21 } 22 int main() 23 { 24 scanf("%d",&n); 25 for (int i=0;i<n;i++) scanf("%d",&len[i]); 26 for (int i=1;i<=(1<<n)-1;i++) 27 { 28 int sum=0; 29 for (int j=0;j<n;j++) if (i&1<<j) sum+=len[j]; 30 dp(sum,i); 31 } 32 dfs(0,0,0,0,0); 33 if (ans) printf("%d",ans); else printf("No Solution"); 34 }
标签:矩形,Jzoj,int,P2679,状压,dfs,栏杆,x1,演唱会 来源: https://www.cnblogs.com/Comfortable/p/11142706.html