# 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 for 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 new rice ball. The new rice ball’s size is the sum of the two old rice balls’ sizes. It occupies the position 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 ball does not need to have the same size as the other two.) The new rice ball’s size is the sum of the 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.

Input Specification

The first line will contain the integer, N (1 ≤ N ≤ 400).The next line will contain N space separated integers representing the sizes of the rice balls, in order from left to right. Each integer is at least 1 and at most 1 000 000.

Output Specification

Output the size of the largest riceball Alphonse can form.

Sample Input 1

7 4 7 12 12 3 9 9 3

Output for Sample Input

48

Explanation for Output for Sample Input 1

One possible set of moves to create a riceball of size 48 is to combine 12 and 12, forming a riceball of size 24. Then, combine 9 and 9 to form a riceball of size 18. Then, combine 3, 18 and 3 to forma riceball of size 24. Finally, combine the two riceballs of size 24 to form a riceball of size 48.

Sample Input 2

4

1 2 3 1

Output for Sample Input 2

3

Explanation for Output for Sample Input 2There are no moves to make, thus the largest riceball in the row is size 3

Solution: dynamic programming

#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 2016 s4 Combining Riceballs

2016-08-30 23:07:21

#### codeforces 792E —— Colored Balls （贪心，不定方程，数学）

2017-03-29 22:46:14

#### Codeforces Round #472 (rated, Div. 2, based on VK Cup 2018 Round 2)题解

2018-03-31 21:33:34

#### CodeForces 653A Bear and Three Balls

2016-05-30 12:54:19

#### 周赛题 （华中农业大学第四届程序设计大赛网络同步赛）

2016-05-15 21:24:25

#### ccc 2016 s4

2016-08-30 23:11:08

#### Combining sketch and tone for pencil drawing production简述

2017-07-04 21:18:46

#### Combining Sketch and Tone for Pencil Drawing Production的优化过程

2016-04-25 23:08:19

#### Combining Pattern Classifiers Methods and Algorithms

2017年08月30日 2.93MB 下载

#### 改进的《Combining Sketch and Tone for Pencil Drawing Production》铅笔画算法

2017-02-04 21:04:12