这题有没有用按一行三个点的走法讨论出来了的佬帮忙看下啊(
查看原帖
这题有没有用按一行三个点的走法讨论出来了的佬帮忙看下啊(
118196
zimujun楼主2021/10/7 15:39

RT

做的时候脑子让门夹了,想到按一行三个点的情况分讨却没想每条分界线,然后直接莽上去了,它甚至还过了样例qq_emoji: wul然后一边感叹着“我居然一次写对了!!”交上去就 WA on 3 了qq_emoji: wulqq_emoji: xia

思路和按边分讨类似,不过是分如下这 15qq_emoji: wul种情况:

代码后面注释部分有比 test3 更清晰的 hack 数据,有观察力qq_emoji: wul大仙帮忙看看吗qq_emoji: wul如果有的话感激不尽,只是进来参观的也可

#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
*/
2021/10/7 15:39
加载中...