POJ1185 狀態壓縮DP 又是一道有意義的水題

2021-06-19 01:52:30 字數 791 閱讀 3559

之前做過poj3285,那道題下一行的狀態只和上一行有關,所以每一行只需要記錄一行的狀態。

這乙個炮兵陣地,炮可以打兩行,所以不僅僅與上一行有關,還與上上一行有關,所以每一行的狀態都由上兩行狀態推出,因為要記錄兩個狀態,所以用了乙個三維的dp,

dp[i][j][k],表示第i行狀態為state[k],第i-1行狀態為state[j]時前i行最多有幾個炮兵。

寫的時候一開始在初始化的時候沒有注意硬體條件,掛了一發。

寫完這個程式,100+行,編譯了一下,還是有乙個for迴圈中int忘記定義,除了這個之外就沒有錯誤了。這種感覺真不錯,不過還是有邏輯錯。

第乙個邏輯錯是混淆了poj3285和這個題的所求的東西,在特判行數為1的時候統計成了此時的狀態數量。

第二個邏輯錯是初始化的時候沒加上對硬體條件的判斷。

真是的,要謹慎啊。

不能疏忽。

#include#include#includeusing namespace std;

int state[62];

int num[62];

int dp[102][62][62];//dp[i][j][k] 表示前i行中 i行為k種狀態 i-1行為j種狀態時所能放置的最大炮兵數

int tot=0;

int row[200];

int cal(int i)

return count;

}void init(int n)

}printf("%d\n",max_);

return 0;

}

poj 1185 狀態壓縮DP

這題開始直接狀態壓縮每行 2 m 然後就tle了。最後看了下別人的發現其實每行的狀態沒有這麼多,因為相鄰兩個大炮的距離不能小於2 所以當m為10 的時候每行的狀態只有60種,每次在得到m的時候,直接搜出這些狀態儲存起來,然後就可以了。ac 如下 include include include inc...

POJ 1185 (狀態壓縮DP)

中文題目,題意就不說了。不得不說這是一道十分經典的狀態壓縮dp的題目。思路 通過分析可以發現,第i行的格仔能不能放大炮僅與第i 1和i 2行的放法有關,而與前面的放法無關,因此,如果我們知道了i 1行和i 2放的狀態,那麼,我們就可以推出第i行的可行的放法狀態。因此可以看出i行的狀態由它上面兩行決定...

poj1185 狀態壓縮DP

狀態壓縮學習 tju 周偉的 狀態壓縮 第乙個狀態壓縮dp,留 以後好看 1 include2 include 3 include4 define n 101 5 define m 11 6 define s 66 7 define max a,b a b?a b89 intstate n s 10...