poj 1185 狀態壓縮DP

2021-06-21 03:36:34 字數 889 閱讀 2484

這題開始直接狀態壓縮每行 2^m 然後就tle了。。。。

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

ac**如下:

#include #include #include #include using namespace std;

int n, m;

int st[100], num[100], tot;

int dp[2][100][100];

char maps[100][10];

void getstatu( int statu, int pos, int sum )

getstatu( statu, pos + 1, sum );

getstatu( statu | ( 1 << pos ), pos + 3, sum + 1 );

}bool judge( int r, int now, int pre1, int pre2 )}}

return true;

}int main()

tot = 0;

getstatu( 0, 0, 0 );

memset( dp, -1, sizeof( dp ) );

int now = 0;

dp[now][0][0] = 0;

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

}}

}int ans = 0;

for( int i = 0; i < tot; i++ )

}cout << ans << endl;

}return 0;

}

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

poj1185 狀態壓縮的dp

noi炮兵陣地,經典題!題意 略 解答 我一開始的思路是基於三進製的,0表示這個方格不受控制,1表示這個方格收到距離為1的方格的控制,2表示這個方格收到距離為2的方格的控制。後來發現有點煩!所以換了乙個。令f i j k 表示第i行,i 1行狀態為k,i 2行的狀態為j。j,k均為01串,1表示有炮...