HDU 4597 Play Game

题目链接

什么都不想说,最近状态暴跌。。

 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 }
原文地址:https://www.cnblogs.com/naix-x/p/3287995.html