POJ 1185 炮兵陣地

2021-06-13 15:44:18 字數 1278 閱讀 3128

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #define sz(v) ((int)(v).size())

#define rep(i, n) for (int i = 0; i < (n); ++i)

#define repf(i, a, b) for (int i = (a); i <= (b); ++i)

#define repd(i, a, b) for (int i = (a); i >= (b); --i)

#define max(a, b) a>b?a:b

#define maxx 110

#define inf 20000000

typedef long long ll;

typedef unsigned long long unll;

using namespace std;

const int maxint = -1u>>1;

const int max_status = 1024;

const double pi = acos(-1.0);

int n, m, maxv = 0, cnt = 0;

/* dp[i][j][k] 表示第i行狀態為j,第i-1行狀態為k時的炮兵最大值

* state[i]表示第i種狀態怎麼放炮兵(即第i種狀態是什麼狀態)

* num[i] 表示第i種狀態能放多少個炮兵

* bmap[i]表示第i行的地形(0表示p, 1表示h)

* 則答案為dp[n][0..n][0..m]的最大值

*/int dp[110][65][65], num[65], bmap[110], state[65] ;

void init()

}void solve()

}else } }

} }

for(int j = 0; j < cnt; j++) }}

int main()

//cout << bmap[i] << endl;

}init();

solve();

printf("%d\n", maxv);

} return 0;

}

第一次做狀態dp,參考了這裡的解析,

詳細解析,ac了之後對位運算,狀態壓縮思想有了進一步的了解。

poj 1185 炮兵陣地

題目鏈結 題意 在n m的網格地圖上部署炮兵部隊。地圖的每一格可能是山地 用 h 表示 也可能是平原 用 p 表示 如下圖。在每一格平原地形上最多可以布置一支炮兵部隊 山地上不能夠部署炮兵部隊 一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域所示 如果在地圖中的灰色所標識的平原上部署一支炮兵部隊,則圖中...

POJ 1185 炮兵陣地

狀態壓縮專題第一題,自己想了很久,最終還是以別人的 為模板寫的。dp共三維,一維是行數,一維是前一行狀態,一維是前第二行狀態。ps 直接開三維太大,用s陣列記錄下所有可能出現的情況,大大減少時間和空間。include include include includeusing namespace st...

POJ 1185 炮兵陣地

非常有趣的乙個問題,也困擾了我一段時間。利用遞迴的話由於有大量重複計算的內容,所以可以使用動態規劃,獲取所有的需要計算的值。題目內容中存在上兩行都對當前行的選擇存在影響,所以不同於一般的動態規劃。我本來是希望將地圖的每兩行合併為一行,之後通過動態規劃儲存在確定上兩行的情況下的最優解。不過在最壞情況下...