1. 程式人生 > >POJ 2441 Arrange the Bulls(狀壓dp)

POJ 2441 Arrange the Bulls(狀壓dp)

題解:本題可能就考驗的是對位運算的掌握叭…dp[s]dp[s]表示在狀態為ss的情況下滿足方案的個數。首先滿足第一個球隊喜歡的場地,然後列舉場地集合,就有如果ii喜歡jj並且已有集合ss裡還未存在jj,則dp[sj]=dp[sj]+dp[s]dp[s | j] = dp[s | j] + dp[s]。最後將所有狀態裡可以滿足nn個球隊的方案數加起來。

程式碼

#include<iostream>
#include<bitset>

using namespace std;
const int N = 20
; int dp[1<<N]; bool like[N][N]; int main() { #ifndef ONLINE_JUDGE freopen("input.in","r",stdin); #endif int n,m,k,a,b; cin >> n >> m; for(int i = 0; i < n; ++i) { cin >> k; for(int j = 0; j < k; ++j) { cin >> b; like[i][b - 1] = 1; } } for(int
i = 0; i < m; ++i) { if(like[0][i]) dp[1 << i] = 1; } for(int i = 1; i < n; ++i) { //列舉大小為i的子集 for(int s = (1 << i) - 1, x, y; s < (1 << m); x = s & -s, y = s + x, s = ((s & ~y) / x >> 1) | y) { if(dp[s]) { for(int j = 0; j < m; ++j) { if(like[
i][j] && !((s >> j) & 1)) { dp[s | (1 << j)] += dp[s]; } } } } } int ret = 0; for(int bit = 0; bit < (1 << m); ++bit) if(bitset<32>(bit).count() == n) ret += dp[bit]; cout << ret << endl; return 0; }

相關推薦

POJ 2441 Arrange the Bulls(dp)

題解:本題可能就考驗的是對位運算的掌握叭…dp[s]dp[s]dp[s]表示在狀態為sss的情況下滿足方案的個數。首先滿足第一個球隊喜歡的場地,然後列舉場地集合,就有如果iii喜歡jjj並且已有集合sss裡還未存在jjj,則dp[s∣j]=dp[s∣j]+dp

【bzoj4145】[AMPPZ2014]The Prices dp

return std sin highlight string span 題目 狀態壓縮dp print 原文地址:http://www.cnblogs.com/GXZlegend/p/6832200.html 題目描述 你要購買m種物品各一件,一共有n家商店,你到第i家

Poj - 3254 Corn Fields 【DP】(經典)

初始化 include str 結果 沖突 += poj ota scanf 題目鏈接:https://vjudge.net/contest/224636#problem/G 轉載於:https://blog.csdn.net/harrypoirot/article/det

poj 2663 Tri Tiling (dp+多米諾骨牌問題+滾動陣列反思)

本來直接一波狀壓dpAC的 #include<cstdio> #include<cstring> #include<algorithm> #define REP(i

poj 3420 Quad Tiling (dp+多米諾骨牌問題+矩陣快速冪)

還有這種操作?????? 直接用pre到now轉移的方式構造一個矩陣就好了。 二進位制長度為m,就構造一個長度為1 << m的矩陣 最後輸出ans[(1 << m) - 1

POJ 1185 炮兵陣地【DP+狀態預處理】

題目連結 題意:P處放大炮H不可放,黑色區域為攻擊範圍,求大炮不能相互攻擊的情況下,安裝最多的大炮數. 分析:三維狀壓DP 一開始亂寫了一通,真不知道寫的是什麼,竟然過了樣例,欺騙了自己??? 看了題解要提前把狀態預處理一下,其實也就60個狀態滿足,然後三維狀

POJ 3254 Corn Fields(DP

題目連結 Description Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N

POJ 2836 Rectangular Covering(DP->覆蓋所有點的最小矩形面積和)

Rectangular Covering Time Limit:1000MS     Memory Limit:65536KB     64bit IO

POJ - 1170 Shopping Offers(dp

最近在學習dp,這道題感覺挺不錯的,(蟹蟹親愛噠細心講解,手動艾特,最喜歡你啦~) 題意:購物車裡有b種(0=<b<=5)物品,每種物品告訴物品代號c(1=<c<=999),數量為k(1=<k<=5),單價為p.超市有s種優惠方案,每種優惠方案包含n種物品,分

poj 2411 骨牌覆蓋問題 dp

題意:用1*2 的矩形通過組合拼成大矩形,求拼成指定的大矩形有幾種拼法 分析: 這題的關鍵在於什麼狀態是合法的,可以這樣想,用1表示有骨牌覆蓋,用0表示空著。在覆蓋第i行的時候,那麼如果覆蓋的狀態是合法的,覆蓋完後第i-1行必須沒有空格了(全是1111),所以可以看出,每

POJ 2441 DP

you 得到 memset iostream using fine put err lan Arrange the Bulls Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 5289

poj 3311 Hie with the Pie 經過所有點(可重)的最短路徑 dp

n) 一個點 markdown 當前 stream 長度 strong inline 狀態 題目鏈接 題意 給定一個\(N\)個點的完全圖(有向圖),求從原點出發,經過所有點再回到原點的最短路徑長度(可重復經過中途點)。 思路 因為可多次經過同一個點,所以可用floyd先預

Hie with the Pie(POJ 3311)DP

red san directly itself ffffff 16px say integer help Description The Pizazz Pizzeria prides itself in delivering pizzas to its customers

POJ 3311 Hie with the Pie【DP+floyed】

題意: 將所有外賣送去所有對應地點再回到店鋪,求最短路。 分析:Floyed預處理任意兩點最小距離,然後二維狀壓(最後的結束位置要考慮,不然回到起點的距離沒辦法計算)。 dp[j+1][(1&l

POJ - 3311 - Hie with the Pie(DP

space stdout tin while type iostream scanf lse min 【題目描述】 給你一個n個城市的圖,城市1~n標號,問從0點把所有城市都走一遍,且只走一遍,再回到0的最短路。 n <= 10. 【題目解析】 先求出任

POJ 3254 Corn Fields (DP)

sign inline con cout ont tor const put 方式 題意:給定一個n*m的01矩陣,然後求有多少種方式,在1上並且1不相鄰。 析:一個簡單的狀壓DP,dp[i][s] 表示 第 i 行狀態為 s 時有多少種,然後只要處理不相鄰就行了,比賽進位

POJ 1185 炮兵陣地 (DP)

pre int fine clu mat 狀態 print 優化 ans 題意:中文題。 析:dp[i][s][t] 表示第 i 行狀態為 s, 第 i-1 行為 t,然後就很簡單了,但是要超內存,實際上狀態最多才60個,所以後兩維開60就好, 然後又超時間,就一直加優化,

poj - 1185 炮兵陣地 DP 解題報告

其他 無法 popu mon 多少 mod tdi 遞推關系 r+ 炮兵陣地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21553 Accepted: 8363

POJ 2288 Islands and Bridges(dp

pen clas tdi pac pre 初始 路徑 nds queue http://poj.org/problem?id=2288 題意: 有n個島嶼,每個島嶼有一個權值V,一條哈密頓路徑C1,C2,...Cn的值為3部分之和: 第1部分,將路徑中每個島嶼的權值累

dp)NOI 2001(POJ 1185) 炮兵陣地

上下 數據 enter 能夠 sam src max spa 參加 司令部的將軍們打算在N*M的網格地圖上部署他們的炮兵部隊。一個N*M的地圖由N行M列組成,地圖的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下圖。在每一格平原地形上最多可以布置一支炮