zoukankan      html  css  js  c++  java
  • [JOI 2015 Final] 分蛋糕 2

    link

    试题分析

    容易发现性质,选择的是一段区间,但是贪心无法去维护这件事情,所以考虑$dp$,且我们只要去设计关于$JOI$的选择。

    设$dp(i,j)$为现在要在$[l,r]$区间内选择,然后就可以随便写了。

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    #define int long long
    using namespace std;
    inline int read(){
        int f=1,ans=0;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
        return f*ans;
    }
    const int N=4001;
    int dp[N][N],n,val[N],maxn;
    int dfs(int l,int r){
        if(l==r) return dp[l][r]=val[l];
        if(l+1==r) return dp[l][r]=max(val[l],val[r]);
        if(dp[l][r]!=-1) return dp[l][r]; 
        int res=0;
        if(val[l+1]>val[r]) res=max(res,dfs(l+2,r)+val[l]);
        else res=max(res,dfs(l+1,r-1)+val[l]);
        if(val[l]<val[r-1]) res=max(res,dfs(l,r-2)+val[r]);
        else res=max(res,dfs(l+1,r-1)+val[r]);
        return dp[l][r]=res;
    }
    signed main(){
        memset(dp,-1,sizeof(dp));
        n=read();
        for(int i=1;i<=n;i++) val[i]=val[i+n]=read();
        for(int i=1;i<=n+1;i++){
            maxn=max(maxn,dfs(i,i+n-1));
        }
        printf("%lld
    ",maxn);
    }
    View Code
  • 相关阅读:
    标准差,绝对中位差
    批处理计时
    四元数压缩
    float类型的存储方式
    通俗易懂理解——浮点与定点的计算机表示及互转
    max MultiRes修改器
    Topogun拓补工具
    3dmax高模到低模烘法线
    在线曲线绘制
    景深
  • 原文地址:https://www.cnblogs.com/si-rui-yang/p/10159384.html
Copyright © 2011-2022 走看看