# ccc 2016 s4 Combining Riceballs

31人阅读 评论(0)

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

0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：311次
• 积分：52
• 等级：
• 排名：千里之外
• 原创：5篇
• 转载：0篇
• 译文：0篇
• 评论：0条
文章分类
文章存档
阅读排行
评论排行