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