https://ac.nowcoder.com/acm/contest/882/F
虽然是个暴力题。。。但是当时场上过的并不多 我也不是很懂 抄的大佬的 写下注释吧。
#include<algorithm>
#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<ctime>
#include<map>
#include<stack>
#include<set>
#include<cstring>
#include<sstream>
using namespace std;
typedef long long ll;
int n;
ll ans = 0;
int acnt = 0, bcnt = 0;//a b组当前人数
ll arr[30][30];
int a[15], b[15];//a b组人的编号
void dfs(int pos, ll res) {
if (pos >= 2 * n) {//总人数大于
ans = max(ans, res);//更新答案
return;
}
if (acnt < n) {//A组人数没满
a[++acnt] = pos;//A组acnt号就是当前这个人
ll tmp = 0;
for (int i = 1; i <= bcnt; i++) {
tmp += arr[pos][b[i]];//算出这一行在B组人对A的贡献
}
dfs(pos + 1, res + tmp);//递归 人数多了1 总和加上了上面计算的贡献
acnt--;
}
if (bcnt < n) {
b[++bcnt] = pos;
ll tmp = 0;
for (int i = 1; i <= acnt; i++) {
tmp += arr[pos][a[i]];
}
dfs(pos + 1, res + tmp);
bcnt--;
}
}
int main() {
scanf("%d", &n);
for (int i = 0; i < 2 * n; i++) {
for (int j = 0; j < 2 * n; j++) {
scanf("%d", &arr[i][j]);
}
}
dfs(0, 0ll);
printf("%lld\n", ans);
return 0;
}







Comments | NOTHING