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