[JOI 2015 Final]分蛋糕 2

Posted si-rui-yang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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

 

以上是关于[JOI 2015 Final]分蛋糕 2的主要内容,如果未能解决你的问题,请参考以下文章

2018.10.1「JOI 2014 Final」年轮蛋糕

JOI 2020 Final 火灾

jzoj7197「JOI 2020 Final」只不过是长的领带(两种做法)

loj#2334 「JOI 2017 Final」JOIOI 王国

2018.9.20JOI 2017 Final T2「準急電車 / Semiexpress」

#3468. 「JOI 2021 Final」有趣的家庭菜园 4(双指针&差分)