題目鏈結
如果你是剛剛開始做狀態壓縮dp,我建議你先看看 poj 3254 corn fields 這是一道比這一題更簡單,更容易入門的題目。
還有在**中我用了乙個很巧妙的方法求乙個數二進位制數中1的個數 具體請看我部落格中x& (x - 1)==0 這篇文章 鏈結
。還有一點,不同於poj 3254的地方,我們不能直接列舉所有的狀態。我在getresult()中用到了四重迴圈,直接列舉的時間複雜度是2^40,並且dp那個陣列也是開不下到,不過對於這道題還是有方法的。列舉一行所有的狀態,行合法(沒有兩個1相隔少於兩個)的狀態總共有61中,我們只需要列舉所有合法狀態即可,迴圈次數最多是61^4。
**
#include #include #include using namespace std;const int maxn = 62; //每行合法的狀態總共有61種
int dp[102][maxn][maxn]; //因為狀態是與前兩行有關,所以用到三維陣列
int sta[102]; //每行不能放置的點
int cnt[maxn]; //狀態中1的數目,也就是炮的數目
int allsta[maxn]; //所有可能的狀態
int n, m;
int num; //滿足條件的狀態數
bool judgeself(int x) //判斷x狀態是不是有會相互攻擊的狀態,也就是有沒有兩個1相隔少於兩個0
int count(int x) //用很巧妙的計算出x二進位制中1的個數
return s;
}void search(int x)
{ //這個函式相當於把對狀態進行了離散化,去掉了每行所有不合法的狀態
int t = 1<
poj1185 炮兵陣地(狀態壓縮)
炮兵陣地 time limit 2000ms memory limit 65536k total submissions 15261 accepted 5743 description 司令部的將軍們打算在n m的網格地圖上部署他們的炮兵部隊。乙個n m的地圖由n行m列組成,地圖的每一格可能是山地 ...
poj 1185炮兵陣地(狀態壓縮)
炮兵陣地 time limit 2000ms memory limit 65536k total submissions 32180 accepted 12437 description 司令部的將軍們打算在n m的網格地圖上部署他們的炮兵部隊。乙個n m的地圖由n行m列組成,地圖的每一格可能是山地...
POJ1185 炮兵陣地 狀態壓縮DP
感覺和3254很像,不過這次的間隔變成兩格,當前行的狀態與上兩行的狀態有關。狀態轉移方程 dp k q i max dp k q i dp q j i num k num k 表示狀態k的炮兵數量 dp k q i 表示當前第i行為狀態k上一行的狀態為q的炮兵數量總數。炮兵陣地 time limit...