RT
做的时候脑子让门夹了,想到按一行三个点的情况分讨却没想每条分界线,然后直接莽上去了,它甚至还过了样例然后一边感叹着“我居然一次写对了!!”交上去就 WA on 3 了
思路和按边分讨类似,不过是分如下这 15种情况:
代码后面注释部分有比 test3 更清晰的 hack 数据,有观察力大仙帮忙看看吗如果有的话感激不尽,只是进来参观的也可
#include <bits/stdc++.h>
#define LL long long
const int Maxn = 1e5 + 5;
int n; LL a[4][Maxn], f[Maxn][16];
int main() {
scanf("%d", &n);
for(int i = 1; i <= 3; ++i) for(int j = 1; j <= n; ++j) scanf("%lld", &a[i][j]);
if(n == 1) return printf("%lld", a[1][1] + a[2][1] + a[3][1]), 0;
if(n == 2) return printf("%lld", std::max(std::max(std::max(
a[1][1] + a[2][1] + a[3][1] + a[3][2],
a[1][1] + a[1][2] + a[2][2] + a[3][2]),
a[1][1] + a[2][1] + a[2][2] + a[3][2]),
a[1][1] + a[1][2] + a[2][2] + a[2][1] + a[3][1] + a[3][2])), 0;
f[2][3] = a[1][1] + a[1][2] + a[2][2] + a[3][2];
f[2][4] = a[1][1] + a[2][1] + a[3][1] + a[3][2] + a[2][2] + a[1][2];
f[2][5] = a[1][1] + a[2][1] + a[2][2];
f[2][6] = a[1][1] + a[2][1] + a[2][2] + a[1][2];
f[2][7] = a[1][1] + a[2][1] + a[3][1] + a[3][2] + a[2][2];
f[2][8] = a[1][1] + a[2][1] + a[2][2] + a[3][2];
f[2][9] = a[1][1] + a[1][2] + a[2][2] + a[3][2];
f[2][10] = a[1][1] + a[2][1] + a[3][1] + a[3][2] + a[2][2] + a[1][2];
f[2][11] = a[1][1] + a[1][2];
f[2][12] = a[1][1] + a[2][1] + a[2][2];
f[2][13] = a[1][1] + a[2][1] + a[3][1] + a[3][2];
f[2][14] = a[1][1] + a[1][2] + a[2][2] + a[2][1] + a[3][1] + a[3][2];
for(int i = 3; i <= n; ++i) {
LL o1 = std::max(f[i - 1][4], std::max(f[i - 1][6], std::max(f[i - 1][11], f[i - 1][15])));
LL o3 = std::max(f[i - 1][3], std::max(f[i - 1][8], std::max(f[i - 1][13], f[i - 1][14])));
LL o2 = std::max(f[i - 1][5], std::max(f[i - 1][7], f[i - 1][12]));
f[i][1] = std::max(f[i - 1][1], f[i - 1][9]) + a[1][i] + a[2][i] + a[3][i];
f[i][2] = std::max(f[i - 1][2], f[i - 1][10]) + a[1][i] + a[2][i] + a[3][i];
f[i][3] = o1 + a[1][i] + a[2][i] + a[3][i];
f[i][4] = o2 + a[1][i] + a[2][i] + a[3][i];
f[i][5] = o1 + a[1][i] + a[2][i];
f[i][6] = o2 + a[1][i] + a[2][i];
f[i][7] = o3 + a[2][i] + a[3][i];
f[i][8] = o2 + a[2][i] + a[3][i];
f[i][9] = f[i][3];
f[i][10] = f[i][4];
f[i][11] = o1 + a[1][i];
f[i][12] = o2 + a[2][i];
f[i][13] = o3 + a[3][i];
f[i][14] = std::max(f[i - 1][1], f[i - 1][9]) + a[1][i] + a[2][i] + a[3][i];
f[i][15] = std::max(f[i - 1][2], f[i - 1][10]) + a[1][i] + a[2][i] + a[3][i];
}
LL ans = std::max(f[n][3], std::max(f[n][8], std::max(f[n][13], f[n][14])));
printf("%lld", ans);
return 0;
}
/*
5
1 -1 1 1 1
1 -1 1 -1 1
1 1 1 -1 1
ans = 11
out = 10
*/