10891
这种加搜索的题调着真难调。。找哪错太费劲了。。。
我开始做的就搜索+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; }