這題開始直接狀態壓縮每行 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表示有炮...