zoukankan      html  css  js  c++  java
  • hdu 4597(记忆化搜索)

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

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

     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
    ",max(Left[1],Right[1]));
    38             continue;
    39         }
    40         printf("%d
    ",dfs(1,n,1,n,sum));
    41     }
    42     return 0;
    43 }
    View Code
  • 相关阅读:
    MySQL的备份和恢复-mysqldump
    MySQL日志功能详解
    MySQL查询缓存
    MySQL的用户管理
    doc常用命令
    记录mysql语句
    centos常用命令
    centos 7.6
    centos6 常用命令
    centos6.8 安装软件
  • 原文地址:https://www.cnblogs.com/wally/p/3284408.html
Copyright © 2011-2022 走看看