# ccc 2016 s4 Combining Riceballs

Problem Description

Alphonse has N rice balls of various sizes in a row. He wants to form the largest rice ball possiblefor his friend to eat. Alphonse can perform the following operations:

• If two adjacent rice balls have the same size, Alphonse can combine them to make a newrice ball. The new rice ball’s size is the sum of the two old rice balls’ sizes. It occupies theposition in the row previously occupied by the two old rice balls.

• If two rice balls have the same size, and there is exactly one rice ball between them,Alphonse can combine all three rice balls to make a new rice ball. (The middle rice balldoes not need to have the same size as the other two.) The new rice ball’s size is the sum ofthe three old rice balls’ sizes. It occupies the position in the row previously occupied by the three old rice balls.

Alphonse can perform each operation as many times as he wants.Determine the size of the largest rice ball in the row after performing 0 or more operations.

#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;
}

• 本文已收录于以下专栏：

## 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...

## 【Wunder Fund Round 2016 (Div 1 + Div 2 combined)A】【二进制拆分】Slime Combining 特殊规则二进制拆分

A. Slime Combining time limit per test 2 seconds memory limit per test 256 megabytes ...

## Wunder Fund Round 2016 (Div. 1 + Div. 2 combined) CF618A A. Slime Combining

A. Slime Combining time limit per test2 seconds memory limit per test256 megabytes inputstandard ...

## Wunder Fund Round 2016 (Div. 1 + Div. 2 combined)--A. Slime Combining

A. Slime Combining time limit per test 2 seconds memory limit per test 256 megabytes input sta...

## Beginner-s Guide to Shading and Texturing in 3ds Max 2016

• 2017年10月31日 17:06
• 30.69MB
• 下载

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

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

## HDU Minimum’s Revenge 2016CCPC东北地区大学生程序设计竞赛 - 重现赛

Minimum’s Revenge Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others...

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

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

## mymps5.7S多城市2016蚂蚁分类信息源码 带手机版 独家修复破解版

• 2016年05月18日 17:12
• 10.49MB
• 下载

举报原因： 您举报文章：ccc 2016 s4 Combining Riceballs 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)