poj 1185 && NYOJ 85 炮兵陣地(狀態壓縮dp)

來源:互聯網
上載者:User

標籤:動態規劃

炮兵陣地時間限制:2000 ms  |  記憶體限制:65535 KB難度:6
描述
司令部的將軍們打算在N*M的網格地圖上部署他們的炮兵部隊。一個N*M的地圖由N行M列組成,地圖的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如。在每一格平原地形上最多可以布置一支炮兵部隊(山地上不能夠部署炮兵部隊);一支炮兵部隊在地圖上的攻擊範圍中黑色地區所示: 

如果在地圖中的灰色所標識的平原上部署一支炮兵部隊,則圖中的黑色的網格表示它能夠攻擊到的地區:沿橫向左右各兩格,沿縱向上下各兩格。圖上其它白色網格均攻擊不到。從圖上可見炮兵的攻擊範圍不受地形的影響。
現在,將軍們規劃如何部署炮兵部隊,在防止誤傷的前提下(保證任何兩支炮兵部隊之間不能互相攻擊,即任何一支炮兵部隊都不在其他支炮兵部隊的攻擊範圍內),在整個地圖地區內最多能夠擺放多少我軍的炮兵部隊。
輸入
第一行輸出資料測試組數X(0<X<100)
接下來每組測試資料的第一行包含兩個由空格分割開的正整數,分別表示N和M; 接下來的N行,每一行含有連續的M個字元(‘P‘或者‘H‘),中間沒有空格。按順序表示地圖中每一行的資料。0<=N <= 100;0<=M <= 10。
輸出
每組測試資料輸出僅一行,包含一個整數K,表示最多能擺放的炮兵部隊的數量。
範例輸入
15 4PHPPPPHHPPPPPHPPPHHP
範例輸出
6



分析:dp[i][j][k]表示排列到第i行,第i-1行的狀態為s[j],第i-2行的狀態為s[k]時,最多可以放置多少個炮兵。

則dp[i][j][k] = max(dp[i][j][k], dp[i-1][j][k] +num[i])。第一行和第二行特殊處理。

#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 105;int Map[N];int dp[N][65][65];  //dp[i][j][k]表示放第i行時,第i-1行為第j個狀態,第i-2行為第k個狀態最多可以放多少個炮兵int s[N], num[N];int n, m, p;bool check(int x) {  //判斷本行的炮兵是否互相攻擊    if(x & (x >> 1)) return false;    if(x & (x >> 2)) return false;    return true;}int Count(int x) {  //計算狀態為x時可以放多少個炮兵    int i = 1, ans = 0;    while(i <= x) {        if(x & i) ans++;        i <<= 1;    }    return ans;}void Init() {    p = 0;    memset(s, 0, sizeof(s));    memset(num, 0, sizeof(num));    for(int i = 0; i < (1 << m); i++) { //預先處理出合法狀態        if(check(i)) {            s[p] = i;            num[p++] = Count(i);        }    }}int main() {    char ch;    int T;    scanf("%d", &T);    while(T--) {        scanf("%d%d", &n, &m);        if(!n && !m) {            printf("0\n");            continue;        }        memset(dp, 0, sizeof(dp));        memset(Map, 0, sizeof(Map));        for(int i = 0; i < n; i++) {            for(int j = 0; j < m; j++) {                cin >> ch;                if(ch == 'H')                    Map[i] = Map[i] | (1 << (m - 1 - j));  //P為0,H為1            }        }        Init();//        printf("p = %d\n", p);//        for(int i = 0; i < p; i++) {//            printf("s[%d] = %d, num[%d] = %d\n", i, s[i], i, num[i]);//        }        for(int i = 0; i < p; i++) { //求第一行最多放多少            if(!(Map[0] & s[i]))                dp[0][i][0] = num[i];        }        for(int i = 0; i < p; i++) {  //前兩行最多放多少            if(!(Map[1] & s[i])) {                for(int j = 0; j < p; j++) {                    if((!(s[i] & s[j]))) {                        dp[1][i][j] = max(dp[1][i][j], dp[0][j][0] + num[i]);                    }                }            }        }        for(int r = 2; r < n; r++) {  //枚舉行數            for(int i = 0; i < p; i++) {  //當前行的狀態                if(!(s[i] & Map[r])) {                    for(int j = 0; j < p; j++) {  //上一行的狀態                        if(!(s[j] & Map[r-1])) {                            if(!(s[i] & s[j])) {                                for(int k = 0; k < p; k++) {  //上上一行的狀態                                    if(!(s[k] & Map[r-2])) {                                        if(!(s[j] & s[k])) {                                            if(!(s[i] & s[k])) {                                                dp[r][i][j] = max(dp[r][i][j], dp[r-1][j][k] + num[i]);                                            }                                        }                                    }                                }                            }                        }                    }                }            }        }        int ans = 0;        for(int i = 0; i < p; i++) {            for(int j = 0; j < p; j++) {                if(ans < dp[n-1][i][j])                    ans = dp[n-1][i][j];            }        }        printf("%d\n", ans);    }    return 0;}


poj 1185 && NYOJ 85 炮兵陣地(狀態壓縮dp)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.