第一道状态压缩dp,比较简单,做得也比较暴力,不过还挺适合入门,。。贴个代码纪念一下
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
#define pub push_back
#define LL __int64
using 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;
}