POJ 3254,POJ 1185(狀態壓縮DP)

2021-09-11 04:14:42 字數 1403 閱讀 9245

poj-3254 corn fields

我們可以用二進位制列舉第一行狀態,用1代表在這種植,0代表不種植,第一行確定了,第二行就可以根據第一行不斷累加。dp[row][state]代表第row行用state狀態時的方法數。如果這個state合法,則dp[row][state]=dp[row-1][state1]+dp[row-1][state2]+…

#include

#include

#include

#include

#include

using namespace std;

const

int mod=

100000000

;int tot,state[

1001

],n,m,dp[13]

[1001

],row[13]

;void

unit()

}int

main()

dp[0]

[0]=

1;for(i=

1;i<=n;i++)}

}int ans=0;

for(i=

0;i) cout<}

poj-1185 炮兵陣地

上面的題是求方法總數,這個題是求最大炮兵數目,也就是求某一種方法中的最大炮兵放置數目,因此我們還需要乙個函式用來求炮兵放置的數目,也就是getx()函式。用row[i]儲存第i行原始狀態,p平原代表1,然後用二進位制不斷列舉第一行各種狀態,並儲存起來,因為這個題是牽涉到影響上下兩行,所以需要三維dp,dp[row][i][j]=max(dp[row-1][j][k1],dp[row-1][j][k2]…)+number[i].

dp[row][i][j]代表第row行的狀態為i且 第row-1行狀態為j時的最大炮兵放置數目。

#include

using namespace std;

int tot,n,m,state[

1001

],number[

1001

],dp[

101]

[101][

101]

,row[

101]

;int

getx

(int x)

return num;

}void

unit()

}}intmain()

unit()

;for

(i=0

;i)//dp初始化處理

for(i=

2;i<=n;i++)}

}}int sum=0;

for(i=

0;i)for

(j=0

;j) cout<}

題解 poj3254 狀壓DP

題目鏈結 思路摘抄自大佬部落格 狀態可由二進位制表示,只需將每種狀態轉化為相應的十進位制數,即可只用乙個數字,就能表示某一種狀態 以dp i state j 來表示對於前i行,第i行採用第j種狀態時可以得到的可行方案總數!例如 回頭看樣例資料,dp 2 1 即代表第二行使用第2中狀態 0 1 0 時...

poj3254 基礎狀壓dp

第二個狀壓dp 做過的第乙個也是放牛問題,兩頭牛不能相鄰 這個題多了乙個限制,就是有些位置不能放牛 於是先與處理一下每一行所有不能放牛的狀態,處理的過程直接對每乙個不能放牛的狀態或以下 ac include include include include include include using ...

題解 poj1185 狀壓DP

題目鏈結 思路摘抄自大佬部落格 按層數來dp,如果用 dp i j k 來表示在第 i 行,狀態為 j i 1行狀態為 k 時的狀態,那麼有轉移方程 dp i j k max dp i j k dp i 1 k l num i 列舉 i 層數 j 當前層狀態 k 上一層狀態 l 上上層狀態 就可以來...