bzoj 2064: 分裂【狀態壓縮】
題意:將n個數以最少操作變成m個數,操作為合併分解。
分析:前後數的總和不變,我們可以將n個數合併成一個數,然後分解成m個數,運算元是n+m-2,但是有些數是不用合併的,列舉n和m的子集,每有一對相等ans-2.
這時我們取n的為正數,m的為負數。
程式碼:
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<string> #include<vector> #include<queue> #include<cmath> #include<stack> #include<set> #include<map> #define INF 0x3f3f3f3f #define Mn 1<<20 #define Mm 2010 #define mod 1000000007 #define CLR(a,b) memset((a),(b),sizeof((a))) #define CPY(a,b) memcpy ((a), (b), sizeof((a))) #pragma comment(linker, "/STACK:102400000,102400000") #define ul u<<1 #define ur (u<<1)|1 using namespace std; typedef long long ll; int dp[Mn]; int a[30],b[30]; int sum[Mn]; int lowbit(int x) { return x&(-x); } int main() { int n,m,x; scanf("%d",&n); int num=0; for(int i=0;i<n;i++) { scanf("%d",&sum[1<<i]); } scanf("%d",&m); for(int i=0;i<m;i++) { scanf("%d",&x); sum[1<<(i+n)]=-x; } n+=m; int all=(1<<n)-1; for(int s=1;s<=all;s++) { int x=lowbit(s); sum[s]=sum[x]+sum[s^x]; for(int j=0;j<n;j++) if(s&(1<<j)) dp[s]=max(dp[s],dp[s^(1<<j)]); if(!sum[s]) dp[s]++; } cout<<n-2*dp[all]<<endl; return 0; }
相關推薦
bzoj 2064: 分裂【狀態壓縮】
題意:將n個數以最少操作變成m個數,操作為合併分解。 分析:前後數的總和不變,我們可以將n個數合併成一個數,然後分解成m個數,運算元是n+m-2,但是有些數是不用合併的,列舉n和m的子集,每有一對相等ans-2. 這時我們取n的為正數,m的為負數。 程式碼: #inclu
BZOJ P4057 [CERC2012] Kingdoms【狀態壓縮】
#include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #defin
BZOJ 1076 [SCOI2008]獎勵關【狀態壓縮】【期望DP】
基於hzwer的部落格。 lim[i]lim[i]lim[i]表示可以獲得iii得前提。 考慮倒推,當前狀態的期望=(上一個狀態的期望+這次得到的價值)/概率 #include <bits/stdc++.h> #define db double #d
NKOJ P3802 不死【狀態壓縮】【二分答案】
二分答案即可,狀壓是比較普通的狀態: #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <a
「NOIP2016」 憤怒的小鳥【狀態壓縮】
par[i][j]par[i][j]par[i][j]表示選擇第iii和jjj兩隻小鳥得到的a,ba,ba,b值可以打中哪些小鳥。 然後直接注意精度轉移一下就可以了吖: #include <cmath> #include <cstdio>
NKOJ P3009 [CQ Training 2014 Day3] 碎片【狀態壓縮】
列舉集合與子集: #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm&g
nssl1185-試卷【狀態壓縮】
正題 題目大意 有n張試卷m道題,給出每張試卷每道題的答案(A或B),選擇若干道題,要求至少有k對試卷這些題的選擇不一樣(只要有一題不一樣就行) 解題思路 用二進位制碼錶示試卷,用1表示A,0表示B
SGU P131 Hardwood floor【狀態壓縮】
f[i][s]f[i][s]f[i][s]表示討論到第iii行並且該行覆蓋狀態為sss的方案數。 對於所有可以用來覆蓋的地板,顯然只有六種情況,我們分別根據這六種情況dfsdfsdfs一下就好了。 dfs(row,col,s1,s2,ss1,ss2)dfs(ro
「NOIP模擬」化學【狀態壓縮】
分成兩組狀壓。 #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm&g
【矩陣快速冪】【狀態壓縮】【動態規劃】lydsy4000 [TJOI2015]棋盤
4000: [TJOI2015]棋盤 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 643 Solved: 314 [Submit][Status][Discuss] Description Input 輸入資料的第一行為兩個整數N,M
【狀態壓縮】---狀態壓縮dp第一題
標籤: ACM 題目: Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M
HDU 1429--勝利大逃亡(續)【BFS && 狀態壓縮】
sizeof ott 擁有 之間 數據 memset tdi mes mod 勝利大逃亡(續) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To
Vijos 1921 嚴厲的班長 【狀態壓縮動態規劃】
num con comment 數列 emoji 愛慕 狀態 -1 names 嚴厲的班長 描述 木姑娘在班級裏面是班長。雖然是副班長,卻有著比正班長更高的威信,並深受小朋友們的愛戴。 每天眼保健操時間,木姑娘都要監督所有小朋友認真做眼保健操
【狀態壓縮 meet in middle】poj3139Balancing the Scale
per program 十分 滿足 single 狀態壓縮 scenario sort rotation 數組溢出真是可怕的事情 Description You are given a strange scale (see the figure below)
POJ 1632 Vase collection【狀態壓縮+搜索】
possible span pro there ini -- cal collector 找到 題目傳送門:http://poj.org/problem?id=1632 Vase collection Time Limit: 1000MS Memory Limi
【狀態壓縮dp】1195: [HNOI2006]最短母串
ring output 之前 狀態壓縮 ems cout 長度 html 字典 一個清晰的思路就是狀壓dp;不過也有AC自動機+BFS的做法 Description 給定n個字符串(S1,S2,„,Sn),要求找到一個最短的字符串T,使得這n個字
HDU 5025 Saving Tang Monk 【狀態壓縮BFS】
hat urn clear there this imp sha 初始化 沒有 任意門:http://acm.hdu.edu.cn/showproblem.php?pid=5025 Saving Tang Monk Time Limit: 2000/1000 MS (Jav
POJ-3279 Fliptile 【狀態壓縮+DFS+列舉】
題目傳送門 題目大意:有一個 M * N 的格子,每個格子可以翻轉正反面,它們有一面是黑色,另一面是白色。黑色翻轉之後變成白色,白色翻轉之後則變成黑色。遊戲要做的是把所有的格子翻轉為白色。不過每次翻轉一個格子,與它上下左右相鄰接的格子也會被翻轉。求總翻轉次數最少時,每個格子的翻轉次數。最少翻
Luogu P1558 色板遊戲【線段樹/狀態壓縮】By cellur925
題目傳送門 今天非常想再看一遍霸王別姬想不進去題於是開始刷資料結構 注意到至多隻有\(30\)種顏色,啊啊啊啊我一開始竟然想的不是狀態壓縮而是線上段樹中存一個30大小的陣列,這樣每次更新的時候暴力迴圈一遍。hhhhh。 可能這樣比較好想吧,但是比正解狀態壓縮一下不知道差到哪裡去了:)。開始還智障地把每次
過河 【狀態壓縮DP】+【完整的數論推導過程】
題目連結 題意:很多人以為青蛙是要跳到石頭上,一個個往後跳,問最少需要的石頭數量,其實不然(題目給的樣例的確也是有些坑了),青蛙每次都有跳的距離範圍,題目求的是最少會跳到的石頭,青蛙可以在水中起跳,它要儘可能的避開石頭,也就是問抵達終點時最少需要必經的石頭數。 思路: