1. 程式人生 > >[BZOJ2064]分裂 狀壓dp

[BZOJ2064]分裂 狀壓dp

set href body blog 一次 scan pos problem line

2064: 分裂

Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 656 Solved: 404
[Submit][Status][Discuss]

Description

背景: 和久必分,分久必和。。。 題目描述: 中國歷史上上分分和和次數非常多。。通讀中國歷史的WJMZBMR表示毫無壓力。 同時經常搞OI的他把這個變成了一個數學模型。 假設中國的國土總和是不變的。 每個國家都可以用他的國土面積代替, 又兩種可能,一種是兩個國家合並為1個,那麽新國家的面積為兩者之和。 一種是一個國家分裂為2個,那麽2個新國家的面積之和為原國家的面積。 WJMZBMR現在知道了很遙遠的過去中國的狀態,又知道了中國現在的狀態,想知道至少要幾次操作(分裂和合並各算一次操作),能讓中國從當時狀態到達現在的狀態。

Input

第一行一個數n1,表示當時的塊數,接下來n1個數分別表示各塊的面積。 第二行一個數n2,表示現在的塊,接下來n2個數分別表示各塊的面積。

Output

一行一個數表示最小次數。

Sample Input

1 6
3 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>
 4
#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(int
i=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 }
View Code

[BZOJ2064]分裂 狀壓dp