poj 1185 动态规划

来源:互联网 发布:中国网络房产经纪人 编辑:程序博客网 时间:2024/06/08 00:03

炮兵阵地 动态规划

这个题本应该是上个暑假之前就应该做的,但是当时一个有点懒,不想做,第二这难度也不小,至少对于我来说!一个很好的佐证是今天我花了整整一天的时间才搞定这道题!当然我有我不想完全照抄别人代码的想法,于是就想到了简化,就这简化要命啊!最后在折腾没气之后终于搞定了,吸取的一个教训是:位运算不可乱用,不然死也不知道到底错哪里!

我参考的代码是:滩涂曳尾 详解版

<pre name="code" class="cpp">#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define fi(i,n) for(int i = 0; i < n; i ++)#define MAX(a,b) ((a) > (b) ? (a) : (b))int dp[105][65][65], sum[105], map[105], state[65], cnt, n, m;bool ok(int x){    if(x & (x << 1)) return false;    if(x & (x << 2)) return false;    return true;}int getSum(int x){    int num = 0;    while(x)    {        if(x&1) num ++;        x >>= 1;    }    return num;}void find(){    memset(state, 0, sizeof(state));    cnt = 0;    fi(i,(1<<m)) if(ok(i))    {        state[cnt] = i;        sum[cnt++] = getSum(i);    }}int main(){    while(~scanf("%d%d", &n, &m))    {        memset(dp, -1, sizeof(dp));        memset(map, 0 , sizeof(map));        char s[12];        fi(i,n)        {            scanf("%s", s);            for(int j = 0; j < m; j ++) if(s[j] == 'H')                map[i] |= 1 << j;        }        find();        fi(i,cnt) if(!(map[0] & state[i])) dp[0][i][0] = sum[i];        for(int r = 1; r < n; r ++) fi(i,cnt)        {            if(map[r] & state[i]) continue;            fi(j, cnt)            {                if(state[i] & state[j]) continue;                fi(k,cnt)                {                    if(state[i] & state[k] || state[j] & state[k] || dp[r-1][j][k] == -1) continue;                    dp[r][i][j] = MAX(dp[r][i][j], dp[r-1][j][k] + sum[i]);                }            }        }        int ans = 0;        fi(i,cnt) fi(j,cnt) ans = MAX(ans, dp[n-1][i][j]);        printf("%d\n", ans);    }    return 0;}




0 0