什么都不想说,最近状态暴跌。。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 using namespace std; 5 int p[4][101]; 6 int sum[30][30]; 7 int dp1[30][30],dp2[30][30]; 8 int dp[30][30][30][30]; 9 int dfs1(int x1,int y1) 10 { 11 if(dp1[x1][y1]) 12 return dp1[x1][y1]; 13 if(x1 == y1) 14 return dp1[x1][y1] = p[1][x1]; 15 return dp1[x1][y1] = max(sum[1][y1]-sum[1][x1]-dfs1(x1+1,y1)+p[1][x1],sum[1][y1-1]-sum[1][x1-1]-dfs1(x1,y1-1)+p[1][y1]); 16 } 17 int dfs2(int x1,int y1) 18 { 19 if(dp2[x1][y1]) 20 return dp2[x1][y1]; 21 if(x1 == y1) 22 return dp2[x1][y1] = p[2][x1]; 23 return dp2[x1][y1] = max(sum[2][y1]-sum[2][x1]-dfs2(x1+1,y1)+p[2][x1],sum[2][y1-1]-sum[2][x1-1]-dfs2(x1,y1-1)+p[2][y1]); 24 } 25 int dfs(int x1,int y1,int x2,int y2) 26 { 27 int maxz = 0; 28 if(dp[x1][y1][x2][y2]) 29 return dp[x1][y1][x2][y2]; 30 if(x1 == y1&&x2 == y2) 31 return dp[x1][y1][x2][y2] = max(p[1][x1],p[2][x2]); 32 else if(x1 == y1) 33 { 34 maxz = sum[2][y2]- sum[2][x2-1]-dfs2(x2,y2)+p[1][x1]; 35 maxz = max(maxz,sum[1][y1]-sum[1][x1-1]+sum[2][y2]-sum[2][x2]-dfs(x1,y1,x2+1,y2)+p[2][x2]); 36 maxz = max(maxz,sum[1][y1]-sum[1][x1-1]+sum[2][y2-1]-sum[2][x2-1]-dfs(x1,y1,x2,y2-1)+p[2][y2]); 37 } 38 else if(x2 == y2) 39 { 40 maxz = sum[1][y1] - sum[1][x1-1] - dfs1(x1,y1) + p[2][x2]; 41 maxz = max(maxz,sum[1][y1]-sum[1][x1]+sum[2][y2]-sum[2][x2-1]-dfs(x1+1,y1,x2,y2)+p[1][x1]); 42 maxz = max(maxz,sum[1][y1-1]-sum[1][x1-1]+sum[2][y2]-sum[2][x2-1]-dfs(x1,y1-1,x2,y2)+p[1][y1]); 43 } 44 else 45 { 46 maxz = max(maxz,sum[1][y1]-sum[1][x1]+sum[2][y2]-sum[2][x2-1]-dfs(x1+1,y1,x2,y2)+p[1][x1]); 47 maxz = max(maxz,sum[1][y1-1]-sum[1][x1-1]+sum[2][y2]-sum[2][x2-1]-dfs(x1,y1-1,x2,y2)+p[1][y1]); 48 maxz = max(maxz,sum[1][y1]-sum[1][x1-1]+sum[2][y2]-sum[2][x2]-dfs(x1,y1,x2+1,y2)+p[2][x2]); 49 maxz = max(maxz,sum[1][y1]-sum[1][x1-1]+sum[2][y2-1]-sum[2][x2-1]-dfs(x1,y1,x2,y2-1)+p[2][y2]); 50 } 51 return dp[x1][y1][x2][y2] = maxz; 52 } 53 int main() 54 { 55 int t,n,i,j; 56 scanf("%d",&t); 57 while(t--) 58 { 59 memset(dp,0,sizeof(dp)); 60 memset(dp1,0,sizeof(dp1)); 61 memset(dp2,0,sizeof(dp2)); 62 memset(sum,0,sizeof(sum)); 63 scanf("%d",&n); 64 for(i = 1; i <= 2; i ++) 65 { 66 for(j = 1; j <= n; j ++) 67 { 68 scanf("%d",&p[i][j]); 69 sum[i][j] = sum[i][j-1] + p[i][j]; 70 } 71 } 72 printf("%d ",dfs(1,n,1,n)); 73 } 74 return 0; 75 }