hdu4597Play Game(记忆化)

链接

通化邀请赛的题 貌似不怎么难

记忆化DP 状态方程类似于2维的 只是变成了4维  每次有四种方向去搜 取最棒的

判断好边界条件

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 using namespace std;
 7 int p1[25],p2[25],sum1[25],sum2[25];
 8 int dp[25][25][25][25];
 9 int dfs(int i1,int j1,int i2,int j2)
10 {
11     if(dp[i1][j1][i2][j2]!=-1)
12     return dp[i1][j1][i2][j2];
13     if(i1>j1&&i2>j2)
14     return dp[i1][j1][i2][j2] = 0;
15     int d1=0,d2=0,d3=0,d4=0;
16     int s1 = sum1[j1]-sum1[i1-1];
17     int s2 = sum2[j2]-sum2[i2-1];
18     if(i1<=j1)
19     {
20         d1 = s2+sum1[j1-1]-sum1[i1-1]-dfs(i1,j1-1,i2,j2)+p1[j1];
21         d2 = s2+sum1[j1]-sum1[i1]-dfs(i1+1,j1,i2,j2)+p1[i1];
22     }
23     if(i2<=j2)
24     {
25         d3 = s1+sum2[j2-1]-sum2[i2-1]-dfs(i1,j1,i2,j2-1)+p2[j2];
26         d4 = s1+sum2[j2]-sum2[i2]-dfs(i1,j1,i2+1,j2)+p2[i2];
27     }
28     dp[i1][j1][i2][j2] = max(max(d1,d2),max(d3,d4));
29     return dp[i1][j1][i2][j2];
30 }
31 int main()
32 {
33     int i,n,t;
34     scanf("%d",&t);
35     while(t--)
36     {
37         cin>>n;
38         memset(sum1,0,sizeof(sum1));
39         memset(sum2,0,sizeof(sum2));
40         memset(dp,-1,sizeof(dp));
41         for(i = 1 ; i <= n ;i++)
42         {
43             scanf("%d",&p1[i]);
44             sum1[i] = sum1[i-1]+p1[i];
45         }
46         for(i = 1 ; i<= n ; i++)
47         {
48             scanf("%d",&p2[i]);
49             sum2[i] = sum2[i-1]+p2[i];
50         }
51         int ans = dfs(1,n,1,n);
52         cout<<ans<<endl;
53     }
54     return 0;
55 }
View Code
原文地址:https://www.cnblogs.com/shangyu/p/3279906.html