多组数据是个坑(我没长眼)
其它还好,比上一道题简单,理解起来容易点
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1 << 20;
int now[N], nxt[N];
int main() {
int n;
while(~scanf("%d", &n)) {
int v, ans = 0;
memset(now, 0, sizeof now);
memset(nxt, 0, sizeof nxt);
for(int i = 0; i < n; i ++)
for(int j = 0; j < n; j ++) {
scanf("%d", &v);
for(int s = 0; s < (1 << n); s ++) {
//假如不取当前[i, j]的数
int news = s & ~(1 << j);
nxt[news] = max(nxt[news], now[s]);
//假如取[i, j]的数,要判断左上都为0(没有取)
news = s | (1 << j);
if(!(s & (1 << j)) && (j == 0 || !(s & (1 << (j - 1)))))
nxt[news] = max(nxt[news], now[s] + v);
}
swap(nxt, now);
}
for(int s = 0; s < (1 << n); s ++)
ans = max(ans, now[s]);
printf("%d\n", ans);
}
return 0;
}
2021-06-21第一次