2018 09 22 牧場的安排(狀壓dp)

2021-08-28 08:48:01 字數 1445 閱讀 7380

描述

農民 john 購買了一處肥沃的矩形牧場,分成m*n(1 <= m <= 12; 1 <= n <= 12)個 格仔。他想在那裡的一些格仔中種植美味的玉公尺。遺憾的是,有些格仔區域的土地是貧瘠的, 不能耕種。 精明的 fj 知道奶牛們進食時不喜歡和別的牛相鄰,所以一旦在乙個格仔中種植玉公尺,那麼 他就不會在相鄰的格仔中種植,即沒有兩個被選中的格仔擁有公共邊。他還沒有最終確定哪些 格仔要選擇種植玉公尺。

作為乙個思想開明的人,農民 john 希望考慮所有可行的選擇格仔種植方案。由於太開明, 他還考慮乙個格仔都不選擇的種植方案!請幫助農民 john 確定種植方案總數。

輸入line 1: 兩個用空格分隔的整數 m 和 n

lines 2…m+1: 第 i+1 行描述牧場第i行每個格仔的情況, n 個用空格分隔的整數,表示 這個格仔是否可以種植(1 表示肥沃的、適合種植,0 表示貧瘠的、不可種植)

輸出line 1: 乙個整數: fj 可選擇的方案總數 除以 100,000,000 的餘數。

樣例輸入

2 31 1 1

0 1 0

樣例輸出

提示給可以種植玉公尺的格仔編號:

1 2 3 4

只種乙個格仔的方案有四種 (1, 2, 3, 或 4),種植兩個格仔的方案有三種 (13, 14, 或 34),種植三個格仔的方案有一種 (134),還有一種什麼格仔都不種。 4+3+1+1=9。

標籤usaco2007nov glod

簡單狀壓dp。

直接預處理出所有合法情況。

f [i

][j]

f[i][j]

f[i][j

]表示前i行,第i行狀態為sta

[[j]

sta[[j]

sta[[j

]

#include

#define n 20

#define mod 100000000

using

namespace std;

int n,m,sta[

4005

],ban[n]

,tot=

0,f[n]

[4005

],ans=0;

intmain()

for(

int i=

1;i<=tot;

++i)if(

(sta[i]

|ban[1]

)==ban[1]

)f[1

][i]=1

;for

(int i=

2;i<=n;

++i)}}

for(

int i=

1;i<=tot;

++i)

(ans+

=f[n]

[i])

%=mod;

cout

}

牧場的安排(狀壓dp)

說明備註 題目思路 farmerjohn新買了一塊長方形的牧場,這塊牧場被劃分成m行n列 1 m 12 1 n 12 每一格都是一塊正方形的土地。fj打算在牧場上的某幾格土地裡種上美味的草,供他的奶牛們享用。遺憾的是,有些土地相當的貧瘠,不能用來放牧。並且,奶牛們喜歡獨佔一塊草地,於是fj不會選擇兩...

基本的狀壓DP

給出乙個 times 要求棋子不相鄰,求方案數 n 100 m 8 f i s sum 為零表示不相鄰 s 表示當前行中棋子的情況 解析 我們會發現乙個問題,上述式子確實可以保證上下行不相鄰,但是左右呢,對於我這個剛認識狀壓的菜雞來說,很懵逼,答 狀態壓縮的本質 存在乙個維度是在進製級別表達多組狀態...

狀壓DP的總結

狀壓dp的標誌 資料小 通過題目所給出的條件以後得到的特徵集合小 一 cf259div2 d 題目大意 保證b i 中每個數互質,給出a i 然後求1 n的abs a i b i 最小。a i 30 思路 首先得到b i 必然小於60。這個很重要,因為我們列舉的b的集合就是60.首先當b如果都取1,...