zoukankan      html  css  js  c++  java
  • G

      记忆化搜索

    #include<bits/stdc++.h>
    using namespace std;
    #define maxn
    int dp[105][30][5],a[105],n,m;
    vector<int>v;
    int dfs(int now,int sta,int rest)
    {
        if(rest>=2) //休息2次及以上产生的效果是一样的
            rest=2,sta=0;
        if(dp[now][sta][rest]) return dp[now][sta][rest];
        int tmp=0;
        if(now>n) return dp[now][sta][rest]=tmp;
        if(sta==0)
            tmp=dfs(now+1,sta,rest+1);
        else
            tmp=dfs(now+1,sta-1,rest+1);
        if(v[sta]!=0)// 防止出现调用v[sta]越界,顺便剪枝了
            tmp=max(tmp,dfs(now+1,sta+1,0)+min(v[sta],a[now]));
        return dp[now][sta][rest]=tmp;
    }
    int main()
    {
        scanf("%d %d",&n,&m);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        int tmp=m;
        v.clear();
        v.push_back(tmp);
        while(tmp)
        {
            tmp=tmp*2/3;
            v.push_back(tmp);
        }
        printf("%d
    ",dfs(1,0,0));
        return 0;
    }
    
  • 相关阅读:
    java线程(1)-线程同步
    Scala:(3)数组
    Codeforces 899F Letters Removing
    拼图游戏的可解性
    Hash
    哈夫曼编码
    莫比乌斯
    FFT
    Ropes
    区间合并
  • 原文地址:https://www.cnblogs.com/eason9906/p/11754837.html
Copyright © 2011-2022 走看看