ccc 2016 s4

原创 2016年08月30日 23:11:08
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxn = 400 + 5;
int n; int a[maxn]; int s[maxn];

void init() {
	scanf("%d", &n);
	for (int i = 0 ; i < n; i++) scanf("%d", &a[i]);
	s[0] = a[0];
	for (int i = 1; i < n; i++) s[i] = s[i - 1] + a[i];
}

int sum(int i, int j) {
	return s[j] - s[i] + a[i];
}

bool f[maxn][maxn];

void solve() {
	int ans = 0;
	memset(f, false, sizeof(f));
	for (int i = 0; i < n; i++) f[i][i] = true;
	
	for (int len = 1; len <= n; len ++ ) {
		for (int i = 0; i + len - 1 < n; i ++ ) {
			int j = i + len - 1;
			
			if (f[i][j]) { ans = max(ans, sum(i, j)); continue; }
			
			for (int k = i; k < j; k ++ ) {
				if (f[i][k] && f[k + 1][j] && sum(i, k) == sum(k + 1, j)) { f[i][j] = true; break; }
			}
			
			if (f[i][j]) { ans = max(ans, sum(i, j)); continue; }
			
			for (int len2 = 1; len2 <= len - 2; len2 ++ ) {
				if (f[i][j]) break;
				for (int k = i + 1; k + len2 <= j; k ++ ) {
					int t = k + len2 - 1;
					
					if (f[i][k - 1] && f[k][t] && f[t + 1][j] && sum(i, k - 1) == sum(t + 1, j)) {
						f[i][j] = true; break;
					}
				}
			}
			
			if (f[i][j]) ans = max(ans, sum(i, j));
		}
	}

	printf("%d\n", ans);
}

int main() {
	init(); solve();
	return 0;
}

相关文章推荐

修正出货单确认时计算客户信用度(s_ccc.4gl)_订单未转出货金额BUG

如客户

ccc 16 s4 Combining Riceballs

Alphonse has N rice balls of various sizes in a row. He wants to form the largest rice ball possible...

金盾高级视频加密系统2016S

  • 2014年08月29日 16:16
  • 27.15MB
  • 下载

【GoogleCodeJam2016D】【构造 找规律】Fractiles LG字符串K字符C次变为S个检测位置找金子

Problem D. Fractiles This contest is open for practice. You can try every problem as many tim...

金盾高级视频加密系统2016S-VIP版

  • 2015年10月03日 18:50
  • 26.11MB
  • 下载

深入理解uboot 2016 - 基础篇(S3C2410 与S5PV210处理器启动流程分析)

S3C2440和S5PV210是很多嵌入式爱好者入门的arm处理器,网上的资料也很多。今天我们就来聊聊S3C2440和S5PV210的启动流程,上一篇博客我介绍了uboot在norflah上的启动流程...

S2016-1-2007

  • 2017年04月19日 10:15
  • 193KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ccc 2016 s4
举报原因:
原因补充:

(最多只允许输入30个字)