Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)
Total Submission(s): 24 Accepted Submission(s): 18
php
只有每種狀況記憶化搜索下就能夠了ios
1 /* *********************************************** 2 Author :kuangbin 3 Created Time :2013/8/24 12:37:04 4 File Name :F:\2013ACM練習\比賽練習\2013通化邀請賽\1008.cpp 5 ************************************************ */ 6 7 #include <stdio.h> 8 #include <string.h> 9 #include <iostream> 10 #include <algorithm> 11 #include <vector> 12 #include <queue> 13 #include <set> 14 #include <map> 15 #include <string> 16 #include <math.h> 17 #include <stdlib.h> 18 #include <time.h> 19 using namespace std; 20 int a[30],b[30]; 21 int sum1[30]; 22 int sum2[30]; 23 int dp[30][30][30][30]; 24 int solve(int l1,int r1,int l2,int r2) 25 { 26 if(dp[l1][r1][l2][r2] != -1)return dp[l1][r1][l2][r2]; 27 if(l1 > r1 && l2 > r2) 28 return dp[l1][r1][l2][r2] = 0; 29 int ans = 0; 30 int sum = 0; 31 if(l1 <= r1) 32 sum += sum1[r1] - sum1[l1-1]; 33 if(l2 <= r2) 34 sum += sum2[r2] - sum2[l2-1]; 35 if(l1 <= r1) 36 { 37 ans = max(ans,sum - solve(l1+1,r1,l2,r2)); 38 ans = max(ans,sum - solve(l1,r1-1,l2,r2)); 39 } 40 if(l2 <= r2) 41 { 42 ans = max(ans,sum - solve(l1,r1,l2+1,r2)); 43 ans = max(ans,sum - solve(l1,r1,l2,r2-1)); 44 } 45 return dp[l1][r1][l2][r2] = ans; 46 } 47 int main() 48 { 49 //freopen("in.txt","r",stdin); 50 //freopen("out.txt","w",stdout); 51 int n; 52 int T; 53 scanf("%d",&T); 54 while(T--) 55 { 56 scanf("%d",&n); 57 sum1[0] = sum2[0] = 0; 58 for(int i = 1;i <= n;i++) 59 { 60 scanf("%d",&a[i]); 61 sum1[i] = sum1[i-1] + a[i]; 62 } 63 for(int i = 1;i <= n;i++) 64 { 65 scanf("%d",&b[i]); 66 sum2[i] = sum2[i-1] + b[i]; 67 } 68 memset(dp,-1,sizeof(dp)); 69 printf("%d\n",solve(1,n,1,n)); 70 } 71 return 0; 72 }