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 上上層狀態 就可以來...