AcWing 327 玉公尺田 狀態壓縮動態規劃)

2022-02-24 22:55:38 字數 2001 閱讀 7489

農夫約翰的土地由\(m \times n\) 個小方格組成,現在他要在土地裡種植玉公尺。

非常遺憾,部分土地是不育的,無法種植。

而且,相鄰的土地不能同時種植玉公尺,也就是說種植玉公尺的所有方格之間都不會有公共邊緣

(注意:這裡是上下左右邊緣,不是兩斜對角邊緣)

現在給定土地的大小,請你求出共有多少種種植方法

土地上什麼都不種也算一種方法。

輸入格式

第\(1\)行包含兩個整數\(m\)和\(n\)。

第\(2 \dots m+1\)行:每行包含\(n\)個整數\(0\)或\(1\),用來描述整個土地的狀況,\(1\)表示該塊土地肥沃,\(0\)表示該塊土地不育。

輸出格式

輸出總種植方法對\(100000000\)取模後的值。

資料範圍

\[1 \le m,n \le 2

\]輸入樣例:

2 3

1 1 1

0 1 0

輸出樣例:
9
演算法構造

經典的棋盤型狀態壓縮動態規劃,我們可以按照之前acwing上p1064小國王的思路,處理本題。

首先,我們需要明確,題目的要求:

統計方案數

有些土地不能種植

狀態設計

首先,我們得明確狀態是什麼。

我們這個狀態,肯定是要統計方案數。

我們這個狀態,必然需要表示每一行土地種植的狀態。

因此得到:

\[f[i][s]表示已經種植前i行,且第i行種植的狀態為s的方案數

\]狀態轉移

題目的限制條件,其實就是我們轉移的限制條件。

我們知道,這裡是十字形的禁止種植,也就是上下左右不能有相鄰的兩棵玉公尺。

那麼怎麼判斷呢?

如果說我們把\(1\)表示這個地方種植玉公尺,\(0\)表示不種植

\[s=1110 \quad 1,2,3這三個地方種玉公尺,第四個地方不種植玉公尺

\]對於一行而言,不能種植相鄰的玉公尺。

即:對於一行而言,不能有相鄰的\(1\)

\[s=1110 \quad 是不合法的狀態

\]對於相鄰的兩行而言,不能在同一列都種植玉公尺

\[a=1010 \\\\

b=1000 \\\\

這是不可以的,在第乙個位置會出現上下矛盾

\]那麼我們可以轉化為:

\[a \& b==0

\]最後,對於題目中的土地不能種植,我們可以認為。

\[如果第i行的狀態為s,那麼荒廢土地處不能有1

\]我們可以設計乙個陣列:

\[g[i]表示第i行不能種植土地的狀態 \\\\

g[1]=1011 \quad 表示第一行,第乙個,第三個,第四個位置不能種植玉公尺

\]總而言之

\[第i行的狀態為s \\\\

那麼s \& g[i]==0

\]**解析

#include using namespace std;

const int n=13,mod=100000000;

vectorstate,head[1<>1);

}inline void init()

for(int i=0; i<(1

state.push_back(i);

for(int i=0; ifor(int j=0; jif (!(state[i] & state[j]))//i對應的狀態和j對應的狀態沒有在同一列種植玉公尺

head[i].push_back(j);

f[0][0]=1;

for(int i=1; i<=n+1; i++)

for(int a=0; aprintf("%d\n",f[n+1][0]);//表示第n+1行什麼都沒種植的狀態,其實就是累加f[n][s]

}signed main()

ACWing 327 玉公尺田(狀態壓縮dp入門)

農夫約翰的土地由m n個小方格組成,現在他要在土地裡種植玉公尺。非常遺憾,部分土地是不育的,無法種植。而且,相鄰的土地不能同時種植玉公尺,也就是說種植玉公尺的所有方格之間都不會有公共邊緣。現在給定土地的大小,請你求出共有多少種種植方法。土地上什麼都不種也算一種方法。輸入格式 第1行包含兩個整數m和n...

狀壓DP 玉公尺田

農夫約翰的土地由m n個小方格組成,現在他要在土地裡種植玉公尺。非常遺憾,部分土地是不育的,無法種植。而且,相鄰的土地不能同時種植玉公尺,也就是說種植玉公尺的所有方格之間都不會有公共邊緣。現在給定土地的大小,請你求出共有多少種種植方法。土地上什麼都不種也算一種方法。輸入格式 第1行包含兩個整數m和n...

狀態壓縮DP 玉公尺田

農夫約翰的土地由m n個小方格組成,現在他要在土地裡種植玉公尺。非常遺憾,部分土地是不育的,無法種植。而且,相鄰的土地不能同時種植玉公尺,也就是說種植玉公尺的所有方格之間都不會有公共邊緣。現在給定土地的大小,請你求出共有多少種種植方法。土地上什麼都不種也算一種方法。輸入格式 第1行包含兩個整數m和n...