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

    思路:定义一个四维状态的数组,记录每个状态先手的最优值。

    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #include<cstring>
    #include<cstdio>
    #define Maxn 30
    using namespace std;
    int ans[Maxn][Maxn][Maxn][Maxn],suma[Maxn],sumb[Maxn];
    void init()
    {
        memset(ans,0,sizeof(ans));
        memset(suma,0,sizeof(suma));
        memset(sumb,0,sizeof(sumb));
    }
    inline int Max(int a,int b,int c,int d)
    {
        a=a>b?a:b;
        c=c>d?c:d;
        return a>c?a:c;
    }
    int dfs(int l,int r,int l1,int r1)
    {
        if(l>r&&l1>r1) return 0;
        if(ans[l][r][l1][r1]) return ans[l][r][l1][r1];
        int levsum=suma[r]-suma[l-1]+sumb[r1]-sumb[l1-1];
        int ans1=0,ans2=0,ans3=0,ans4=0;
        if(l<=r){
            ans1=levsum-dfs(l+1,r,l1,r1);
            ans2=levsum-dfs(l,r-1,l1,r1);
        }
        if(l1<=r1){
            ans3=levsum-dfs(l,r,l1+1,r1);
            ans4=levsum-dfs(l,r,l1,r1-1);
        }
        return ans[l][r][l1][r1]=Max(ans1,ans2,ans3,ans4);
    }
    int main()
    {
        int n,i,j,t,x;
        scanf("%d",&t);
        while(t--){
            init();
            scanf("%d",&n);
            for(i=1;i<=n;i++){
                scanf("%d",&x);
                suma[i]=suma[i-1]+x;
            }
            for(i=1;i<=n;i++){
                scanf("%d",&x);
                sumb[i]=sumb[i-1]+x;
            }
            printf("%d
    ",dfs(1,n,1,n));
        }
        return 0;
    }
  • 相关阅读:
    window.onload和DOMContentLoaded的区别
    存储
    JSONP的实现原理
    对于一个无线下拉加载图片的页面,如何给每个图片绑定事件
    事件冒泡
    通用的事件绑定函数
    拆解url的各部分
    如何检测浏览器的类型
    DOM节点操作
    es6基本用法
  • 原文地址:https://www.cnblogs.com/wangfang20/p/3280344.html
Copyright © 2011-2022 走看看