这种加搜索的题调着真难调。。找哪错太费劲了。。。
我开始做的就搜索+dp,但是TLE了。。后来记忆化一下就很快了
//============================================================================
// Name : 10891.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define INF 1<<30
int n, ans1, ans2, ans, a;
int sum[110], d[110][110], table[110][110], flag[110][110];
int dp(bool tag, int l, int r){
int t, t0;
if(flag[l][r] == 1){
if(tag == false){
// printf("tag:%d l:%d r:%d :%d\n",tag, l, r, table[l][r]);
return table[l][r];
}
else{
// printf("tag:%d l:%d r:%d :%d\n",tag, l, r, d[l][r]-table[l][r]);
return d[l][r]-table[l][r];
}
}
if(tag == false){
if(l == r){
// printf("tag: %d l:%d r:%d :%d\n",tag, l, r, d[l][r]);
flag[l][r] = 1;
table[l][r] = d[l][r];
return d[l][r];
}
t = -INF;
for(int i = l;i < r;i++){
t0 = dp(!tag, i+1, r)+d[l][i];
if(t < t0){
t = t0;
}
}
for(int i = l+1;i <= r;i++){
t0 = dp(!tag, l, i-1)+d[i][r];
if(t < t0){
t = t0;
}
}
if(t < d[l][r]){
t = d[l][r];
}
// printf("tag:%d l:%d r:%d :%d\n",tag, l, r, t);
flag[l][r] = 1;
table[l][r] = t;
return t;
}
else{
if(l == r){
// printf("tag:%d l:%d r:%d :0\n",tag, l, r);
flag[l][r] = 1;
table[l][r] = d[l][r];
return 0;
}
t = INF;
for(int i = l;i < r;i++){
t0 = dp(!tag, i+1, r);
if(t > t0){
t = t0;
}
// printf("t0:%d\n", t0);
}
for(int i = l+1;i <= r;i++){
t0 = dp(!tag, l, i-1);
if(t > t0){
t = t0;
}
// printf("t0:%d\n", t0);
}
if(t > 0){
t = 0;
}
// printf("tag:%d l:%d r:%d :%d\n",tag, l, r, t);
flag[l][r] = 1;
table[l][r] = d[l][r]-t;
return t;
}
}
int main() {
freopen("a.txt", "r", stdin);
while(scanf("%d",&n)&&n){
memset(sum, 0, sizeof(sum));
memset(flag, 0, sizeof(flag));
for(int i = 1;i <= n;i++){
scanf("%d", &a);
sum[i] = sum[i-1]+a;
}
for(int i = 1;i <= n;i++){
for(int j = i;j <= n;j++){
d[i][j] = sum[j]-sum[i-1];
// printf("%d ", d[i][j]);
}
// printf("\n");
}
ans1 = dp(false, 1, n);
ans2 = d[1][n]-ans1;
ans = ans1-ans2;
// printf("%d %d\n", ans1, ans2);
printf("%d\n", ans);
}
return 0;
}