POJ Corn Fields 狀態壓縮DP基礎題

2022-05-14 15:14:33 字數 1837 閱讀 6876

題目大意(名稱什麼的可能不一樣,不過表達的意思還是一樣的):

種玉公尺

王小二從小學一年級到現在每次考試都是班級倒數第一名,他的爸爸王大強覺得讀書對於王小二來說應該是沒有出路了,於是決定讓王小二繼承自己的衣缽,從事乙份非常有前途的工作——種玉公尺。王大強是一位富有的農場主,他擁有一塊m*n平方公尺的矩形田地專門用來種玉公尺(1<=m,n<=12)。這個玉公尺地被分成了m*n個,每個格仔是乙個大小為1平方公尺的格仔。這塊玉公尺地中有一些格仔因為還沒有開墾,所以上面長滿了岩石,所以這些格仔是不適合種玉公尺的。相鄰的格仔也是不能同時種玉公尺的,因為如果這麼做了的話,兩個格仔區域的玉公尺因為相互搶奪土壤裡面的資源結果會都長不好。

雖然王小二的成績不好,但是他是乙個喜歡思考的人,他想要知道一共有多少種可行的方式來種玉公尺。

第一行包括兩個正數m和n。

接下來m行每行包含n個整數,數字1表示這個格仔是適合種玉公尺的,數字0表示這個格仔不適合種玉公尺。

輸出乙個整數,表示種玉公尺的方案數。(除 100,000,000 取模)

2 3

1 1 1

0 1 0

9
題目分析:這道題目可以用狀態壓縮dp來處理。

dp[i][j]表示第i行的狀態取為j的時候的方案總數,那麼這個j的狀態是什麼意思呢?

j雖然是乙個整數,但是它其實表示的是一行的所有二進位制狀態。

比如,如果我們某一行的三個格仔分別是:種、不種、種,我們用1表示「種」,用0表示「不種」, 那麼這一行其實可以表示成1,0,1對應的二進位制數就是101,這個數對應的十進位制的數就是1*4+0*2+1*1 = 5

我們還要過濾一下每一行的狀態,第i行的狀態j成立的條件是:

這兩點我在**上面有比較明確的體現。

然後我們就可以得到狀態轉移方程:

dp[i][j] = 1, 其中i==0(第0行),j是第i行的合理狀態(滿足上面提到的兩個條件)

dp[i][j] = sum(dp[i-1][k]),其中i>0,j是第i行的合理狀態,k是第i-1行的所有合理狀態的集合,並且j和k狀態滿足關係式:j&k==0,對應的字面意思就是不存在連續的兩行同一列都種著玉公尺

最後的結果就是sum(dp[m-1][j]),其中j對應第m-1的所有合理狀態。

**:

#include #include #include using namespace std;

const int maxn = 13;

const int mod = 100000000;

int m, n, dp[maxn][1void test()

cout << endl;

}cout << "check:" << endl;

for (int i = 0; i < states[m-1].size(); i ++)

}}int main()

}for (int i = 0; i < m; i ++)

}// 判斷是否相鄰的格仔都種了玉公尺

if (flag) }}

if (flag) }}

int sum = 0;

for (int i = 0; i < m; i ++) }}

if (i == m-1) }}

cout << sum << endl;

// test();

}return 0;

}

表單控制項狀態 禁用狀態

bootstrap框架的表單控制項的禁用狀態和普通的表單禁用狀態實現方法是一樣的,在相應的表單控制項上新增屬性 disabled 和其他表單的禁用狀態不同的是,bootstrap框架做了一些樣式風格的處理 原始碼請檢視bootstrap.css檔案第1723行 第1729行 form control...

狀態模式(State Pattern) 事物狀態

前陣子被大師帶著寫介面,還裝逼學了一下react 這裡是我的react部落格 在傳統的開發中,通常 ui 上諸多狀態變化會讓維護應用的狀態變得很困難和複雜。react 通過檢測狀態變化來每次重新渲染虛擬 dom 節點,然後按需自動更新真實節點,這種方式可以讓開發人員可以簡單地專注在應用的狀態上。在r...

狀態模式 狀態改變行為

what 普遍定義 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來形式改變了其類 自己總結 物件的行為隨著狀態改變 when 那麼何時使用呢?這個根據定義就可知道,當物件的行為根據狀態變化,並且在執行時刻根據狀態變化,就考略用狀態模式.也可以說,當乙個物件的轉換條件過於複雜的時候,使用這個...