poj1185 狀態壓縮的dp

2021-06-05 17:00:17 字數 981 閱讀 2786

noi炮兵陣地,經典題!

【題意】略

【解答】

我一開始的思路是基於三進製的,0表示這個方格不受控制,1表示這個方格收到距離為1的方格的控制,2表示這個方格收到距離為2的方格的控制。後來發現有點煩!所以換了乙個。令f[i][j][k]表示第i行,i-1行狀態為k,i-2行的狀態為j。j,k均為01串,1表示有炮。

則狀態轉移就很方便了,這裡留作思考。

【優化】

上述演算法的時間複雜度還是很高的,可以發現,滿足條件的01串遠遠小於1024種(只有60個),所以可以預處理一下。這樣就快多了。

還可以使用滾動陣列優化空間。

但時間還是有點緊,建議程式寫的細緻些,控制常數。

#include using namespace std;

int f[105][62][62],b[1050];

bool a[105][12];

int i,j,k,t,l,m,n,tot=0,ans;

int isok(int row,int x,int y,int z)

return ans;

}

int main()

for (i=0;i<=n;i++)

for (j=1;j<=tot;j++)

for (k=1;k<=tot;k++)

f[i][j][k]=-1;

f[0][1][1]=0;

for (i=0;i=0 && f[i][j][k]+t>f[i+1][k][l])

f[i+1][k][l]=t+f[i][j][k];

}ans=0;

for (i=1;i<=tot;i++)

for (j=1;j<=tot;j++)

if (f[n][i][j]>ans)

ans=f[n][i][j];

cout << ans;

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...