poj 1185 炮兵阵地(状态压缩dp)
2017-09-07 13:03
423 查看
和 hdu 4539 郑厂长系列故事——排兵布阵 差不多
先筛出来合法条件,攻击范围为上下左右两个格子,所以如果((i&(i<<1)) || (i&(i<<2)))为1,则为非法状态。一共就60个左右。
然后先处理出来前两行,再处理后边的。
因为每一行的状态只和前两行有关,所以dp数组为dp[r][i][j],表示在第r行,当前状态为i,前一行状态为j的情况下最多能放多少兵
先筛出来合法条件,攻击范围为上下左右两个格子,所以如果((i&(i<<1)) || (i&(i<<2)))为1,则为非法状态。一共就60个左右。
然后先处理出来前两行,再处理后边的。
因为每一行的状态只和前两行有关,所以dp数组为dp[r][i][j],表示在第r行,当前状态为i,前一行状态为j的情况下最多能放多少兵
#include <stdio.h> #include <string.h> int dp[101][101][101]; int rec[101]; int row[101]; int n,m; int max(int a, int b) { return a>b?a:b; } int calc(int num) { int ret = 0; while(num) { if(num&1) ret++; num >>= 1; } return ret; } bool check(int a, int b) { for(int i = 0; i < m; ++i) if((a>>i)&(b>>i)) return false; return true; } int main() { int x = 1<<10,k=0; for(int i = 0; i < x; ++i) { if((i&(i<<1)) || (i&(i<<2))) continue; rec[k++] = i; } rec[k] = x; char ch; scanf("%d %d",&n,&m); if(n == 0 || m == 0) { printf("0\n"); return 0; } x = (1<<m); for(int i = 0; i < n; ++i) { for(int j = 0; j < m; ++j) { scanf(" %c",&ch); if(ch == 'P') row[i] = (row[i]<<1)|0; else row[i] = (row[i]<<1)|1; } } int res = 0; /*先处理第一行*/ for(int i = 0; rec[i] < x; ++i) if(!(rec[i]&row[0])) { dp[0][i][0] = calc(rec[i]); res = max(res,dp[0][i][0]); } if(n == 1) { printf("%d\n",res); return 0; } /*处理第二行*/ for(int i = 0; rec[i] < x; ++i) if(!(rec[i]&row[1])) for(int j = 0; rec[j] < x; ++j) if(!(rec[j]&row[0])) if(check(rec[i],rec[j])) { dp[1][i][j] = calc(rec[i])+calc(rec[j]); res = max(res,dp[1][i][j]); } if(n == 2) { printf("%d\n",res); return 0; } for(int r = 2; r < n; ++r) for(int i = 0; rec[i] < x; ++i) if(!(rec[i]&row[r])) for(int j = 0; rec[j] < x; ++j) if(!(rec[j]&row[r-1])) for(int k = 0; rec[k] < x; ++k) if(!(rec[k]&row[r-2])) if(check(rec[i],rec[j]) && check(rec[i],rec[k]) && check(rec[j],rec[k])) { dp[r][i][j] = max(dp[r][i][j],dp[r-1][j][k]+calc(rec[i])); res = max(res,dp[r][i][j]); } printf("%d\n",res); return 0; }
相关文章推荐
- POJ 1185 炮兵阵地 状态压缩DP简单题
- poj 1185 炮兵阵地 【状态压缩dp】
- poj 1185 炮兵阵地(状态压缩DP)
- poj 1185 状态压缩dp-炮兵阵地
- POJ 1185 炮兵阵地(状态压缩DP)
- POJ 1185 炮兵阵地 状态压缩(DP)
- POJ1185炮兵阵地(状态压缩DP)
- POJ - 1185 炮兵阵地 状态压缩DP
- POJ 炮兵阵地 1185 状态压缩dp
- Poj 1185 炮兵阵地 【状态压缩dp】
- poj 1185 炮兵阵地 状态压缩DP
- POJ 1185 炮兵阵地(状态压缩DP)
- POJ 1185 炮兵阵地 (状态压缩dp)
- poj1185炮兵阵地(状态压缩DP)
- 状态压缩dp_POJ1185炮兵阵地
- POJ 1185 炮兵阵地(状态压缩DP)
- POJ1185炮兵阵地(DP状态压缩)
- POJ 1185 炮兵阵地 (状态压缩DP)
- POJ 1185 炮兵阵地 状态压缩DP
- 状态压缩dp入门题 POJ 1185 炮兵阵地