1. 程式人生 > >bzoj 2064: 分裂【狀態壓縮】

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 &amp;&amp; 狀態壓縮

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 middlepoj3139Balancing 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

狀態壓縮dp1195: [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+完整的數論推導過程

題目連結   題意:很多人以為青蛙是要跳到石頭上,一個個往後跳,問最少需要的石頭數量,其實不然(題目給的樣例的確也是有些坑了),青蛙每次都有跳的距離範圍,題目求的是最少會跳到的石頭,青蛙可以在水中起跳,它要儘可能的避開石頭,也就是問抵達終點時最少需要必經的石頭數。 思路: