牧場的安排(狀壓dp)

2021-10-05 11:41:45 字數 1690 閱讀 8657

說明備註:

題目思路:

**farmerjohn新買了一塊長方形的牧場,這塊牧場被劃分成m行n列(1≤m≤12;1≤n≤12),每一格都是一塊正方形的土地。fj打算在牧場上的某幾格土地裡種上美味的草,供他的奶牛們享用。遺憾的是,有些土地相當的貧瘠,不能用來放牧。並且,奶牛們喜歡獨佔一塊草地,於是fj不會選擇兩塊相鄰的土地,即:沒有哪兩塊草地有公共邊。當然,fj還沒有決定在哪些土地上種草。

作為乙個好奇的農場主,fj想知道,如果不考慮草地的總塊數,那麼,一共有多少種種植方案可供他選擇。當然,把新的牧場荒廢,不在任何土地上種草,也算一種方案。請你幫fj算一下這個總方案數。

第1行:兩個正整數m和n,用空格隔開;

第2到m+1行:每行包含n個用空格隔開的整數,描述了每塊土地的狀態。輸入的第i+1行描述了第i行的土地。所有整數均為0或1,1表示這塊土地足夠肥沃,0則表示這塊地上不適合種草。

第1行:輸出乙個整數,即牧場分配總方案數除以10^8 的餘數。

2 31 1 1

0 1 0

按下圖把各塊土地編號:

1 2 3

0 4 0

只開闢一塊草地有4種方案:選1,2,3,4中的任一塊。開闢兩塊草地的話,有3種方案:13,14以及34。選三塊草地只有一種方案:134。再加把牧場荒廢的那一種,總方案數為4+3+1+1=9種。

1≤n,m≤12。

看到n,m小於或等於12就想到狀壓dp,因為兩塊相鄰的地不能種草,所以需要預處理一下。

當i表示每行地的狀態時,(i<<1)&i)0就表示在這一行沒有兩塊地相鄰。

我們可以用乙個vector儲存每行地合法的狀態。

當i表示這一行的狀態,j表示上一行的狀態時,i&j0就表示這兩行沒有地相鄰

當i表示這一行的狀態,j表示這一行是否可以種草的狀態時,i&j==i就說明i狀態是可行的,假如i&j!=i,那麼就存在i狀態的某一列是1,但是這一塊地本身是不能種植的。

用乙個陣列s來儲存這一行是否可以種草的狀態

以行數作為階段,本行的狀態和上一行的狀態作為dp的狀態,是否合法作為決策。

dp[i][j]表示第i行j狀態時前i行的方案數,dp[0][0] = 1作為邊界(都不種也是一種方案)。

狀態轉移是如果本行的j狀態和上一行的k狀態不衝突,那麼本行j狀態的方案數就加上上一行k狀態的方案數,說明k狀態可以到j狀態。

最後統計dp[n][所有狀態]的總方案數。

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

描述 農民 john 購買了一處肥沃的矩形牧場,分成m n 1 m 12 1 n 12 個 格仔。他想在那裡的一些格仔中種植美味的玉公尺。遺憾的是,有些格仔區域的土地是貧瘠的,不能耕種。精明的 fj 知道奶牛們進食時不喜歡和別的牛相鄰,所以一旦在乙個格仔中種植玉公尺,那麼 他就不會在相鄰的格仔中種植...

狀壓dp 玉公尺田 狀壓dp

相關 強相關 327.玉公尺田 狀壓dp 小國王 狀壓dp 是井字形,本題是十字形。思路 狀態計算 時間複雜度 n 2 n 2n o n 22n 12 2 24n 2 n 2 n o n2 12 2 n 2n 2 n o n22n 12 224 看著妥妥超時,但是裡面合法狀態很少 依舊可以過 在此,...

狀壓dp小記

鋪磚 題意 現有nm的一塊地板,需要用12的磚塊去鋪滿,中間不能留有空隙。問這樣方案有多少種 include using namespace std typedef long long ll const int maxn 1 11 int n,m,state ll dp 15 maxn s1表示本行...