题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4597

思路:要保证当前状态下,得到的是最优的,dfs+dp.

hdu 4597(记忆化搜索)_phphdu 4597(记忆化搜索)_php_02
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 int Left[44],Right[44];
 8 int dp[22][22][22][22];
 9 int n,ans,MAX;
10 
11 int dfs(int upl,int downl,int upr,int downr,int sum)
12 {
13     if(dp[upl][downl][upr][downr])return dp[upl][downl][upr][downr];
14     int ans=0;
15     if(upl<=downl){
16         ans=max(ans,sum-dfs(upl+1,downl,upr,downr,sum-Left[upl]));
17         ans=max(ans,sum-dfs(upl,downl-1,upr,downr,sum-Left[downl]));
18     }
19     if(upr<=downr){
20         ans=max(ans,sum-dfs(upl,downl,upr+1,downr,sum-Right[upr]));
21         ans=max(ans,sum-dfs(upl,downl,upr,downr-1,sum-Right[downr]));
22     }
23     return dp[upl][downl][upr][downr]=ans;
24 }
25 
26 int main()
27 {
28   //  freopen("1.txt","r",stdin);
29     int _case,sum;
30     scanf("%d",&_case);
31     while(_case--){
32         scanf("%d",&n);
33         for(int i=1;i<=n;i++)scanf("%d",&Left[i]),sum+=Left[i];
34         for(int i=1;i<=n;i++)scanf("%d",&Right[i]),sum+=Right[i];
35         memset(dp,0,sizeof(dp));
36         if(n==1){
37             printf("%d\n",max(Left[1],Right[1]));
38             continue;
39         }
40         printf("%d\n",dfs(1,n,1,n,sum));
41     }
42     return 0;
43 }
View Code