[BZOJ2064]分裂 狀壓dp
阿新 • • 發佈:2017-12-21
set href body blog 一次 scan pos problem line
Submit: 656 Solved: 404
[Submit][Status][Discuss]
第一行一個數n1,表示當時的塊數,接下來n1個數分別表示各塊的面積。 第二行一個數n2,表示現在的塊,接下來n2個數分別表示各塊的面積。
3 1 2 3
數據範圍:
對於100%的數據,n1,n2<=10,每個數<=50
對於30%的數據,n1,n2<=6,
2064: 分裂
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 656 Solved: 404
[Submit][Status][Discuss]
Description
背景: 和久必分,分久必和。。。 題目描述: 中國歷史上上分分和和次數非常多。。通讀中國歷史的WJMZBMR表示毫無壓力。 同時經常搞OI的他把這個變成了一個數學模型。 假設中國的國土總和是不變的。 每個國家都可以用他的國土面積代替, 又兩種可能,一種是兩個國家合並為1個,那麽新國家的面積為兩者之和。 一種是一個國家分裂為2個,那麽2個新國家的面積之和為原國家的面積。 WJMZBMR現在知道了很遙遠的過去中國的狀態,又知道了中國現在的狀態,想知道至少要幾次操作(分裂和合並各算一次操作),能讓中國從當時狀態到達現在的狀態。Input
Output
一行一個數表示最小次數。Sample Input
1 63 1 2 3
Sample Output
2數據範圍:
對於100%的數據,n1,n2<=10,每個數<=50
對於30%的數據,n1,n2<=6,
HINT
Source
和諧社會模擬賽
1 #include<iostream> 2 #include<cstdlib> 3 #include<cstdio> 4View Code#include<cmath> 5 #include<cstring> 6 #include<algorithm> 7 using namespace std; 8 int m,n,x,sum[1<<21],f[1<<21]; 9 int main() { 10 scanf("%d",&n); 11 for(int i=1;i<=n;i++) scanf("%d",&sum[1<<(i-1)]); 12 scanf("%d",&m); 13 for(inti=1;i<=m;i++) scanf("%d",&sum[1<<(n+i-1)]),sum[1<<(n+i-1)]=-sum[1<<(n+i-1)]; 14 for(int i=1;i<(1<<(n+m));i++) { 15 int t=i&(-i); 16 sum[i]=sum[t]+sum[i-t]; 17 for(int j=1;j<=n+m;j++) if(i&(1<<(j-1))) f[i]=max(f[i],f[i-(1<<(j-1))]); 18 if(!sum[i]) f[i]++; 19 } 20 printf("%d\n",n+m-2*f[(1<<(n+m))-1]); 21 return 0; 22 }
[BZOJ2064]分裂 狀壓dp