之前做過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...