HDU 1565(方格取数)

来源:互联网 发布:三星4821hn网络打印 编辑:程序博客网 时间:2024/05/23 01:49

第一道状态压缩dp,比较简单,做得也比较暴力,不过还挺适合入门,。。贴个代码纪念一下

#include <cstdio>#include <vector>#include <cstring>#include <iostream>#include <algorithm>#define pub push_back#define LL __int64using namespace std;const int N = 25;const int M = 18000;int dp[N][M], g[N][N], sum[N][M];int getSum(int r, int num){    int idx = 1;    int tot = 0;    while(num){        if((num & 1))            tot += g[r][idx];        num >>= 1;        idx++;    }    return tot;}int main(){    int n, i, j, k;    while(~scanf("%d", &n)){        memset(dp, 0, sizeof(dp));        memset(g, 0, sizeof(g));        memset(sum, 0, sizeof(sum));        vector<int> v;        for(i = 1;i <= n;i++)            for(j = 1;j <= n;j++)                scanf("%d", &g[i][j]);        for(i = 0;i <= (1 << n) - 1;i++)            if((i & (i << 1)) == 0){                for(j = 1;j <= n;j++)                    sum[j][v.size()] = getSum(j, i);                v.pub(i);            }        int res = 0;        for(i = 1;i <= n;i++)            for(j = 0;j < v.size();j++)                for(k = 0;k < v.size();k++)                    if((v[j] & v[k]) == 0){                        dp[i][j] = max(dp[i][j], dp[i - 1][k] + sum[i][j]);                        res = max(res, dp[i][j]);                    }        cout << res << endl;    }    return 0;}