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\n",dfs(1,n,1,n));

73     }

74     return 0;

75 }

 

你可能感兴趣的:(game)