POJ1390 - Blocks
加了一个优化反倒慢了,用链表预处理color应该会快一些
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#define INF (int)(1e9)
#define MAXN 8
using namespace std;
int a[210], color[210], len[210], dp[210][210][210];
int solve(int i, int j, int k) {
if (dp[i][j][k] != -1) return dp[i][j][k];
if (k == 0 && i-1 == j) return dp[i][j][k] = 0;
int res = solve(i,j-1,0) + (len[j]+k)*(len[j]+k);
for (int p = i; p < j; ++ p) if (color[p] == color[j]) {
res = max(res, solve(i,p,len[j] + k)+solve(p+1,j-1,0));
}
return dp[i][j][k] = res;
}
int main() {
#ifdef LOCAL
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif // LOCAL
int t, now = 0;
scanf("%d", &t);
while (t --) {
int n;
scanf("%d", &n);
for (int i = 0; i < n; ++ i) {
scanf("%d", &a[i]);
}
a[n] = INF;
int p = 1;
memset(len, 0, sizeof(len));
memset(dp, -1, sizeof(dp));
for (int i = 0; i < n; ++ i) {
color[p] = a[i];
if (a[i] == a[i + 1]) len[p] ++;
else {
len[p]++;
p++;
}
}
printf("Case %d: %d\n", ++now, solve(1,p,0));
}
}
data.in
3
9
1 2 2 2 2 3 3 3 1
1
1
8
1 2 2 3 1 3 2 1
data.out
Case 1: 29
Case 2: 1
Case 3: 18