题解 AT2433 【ケーキの切り分け2 (Cake 2)】

· · 题解

很明显のdp

闲扯

正片开始:

数据范围:

结论:

基本思路:

初始化:

重点!

转移方程:

细节:

完整代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define G() Cr=getchar()
#define LL long long
LL Xr;char Cr;
inline LL rd(){   //读入优化
    Xr=0,G();
    while(Cr<'0'||Cr>'9')G();
    while(Cr>='0'&&Cr<='9')Xr=(Xr<<3)+(Xr<<1)+Cr-'0',G();
    return Xr;
}
#define MAX_N 4005
int n;
LL va[MAX_N],dp[MAX_N][MAX_N],ans;

LL min(LL x,LL y){return x>y?y:x;}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)va[i]=rd(),va[i+n]=va[i]; 
    va[0]=va[n];

    for(int i=1;i<=n;i++)dp[i][i]=dp[i+n][i+n]=va[i];

    for(int k=1;k<n;k++){
        for(int i=1;i+k <= n<<1 ;i++){
            int j=i+k;
            if(k & 1)
                dp[i][j]=max( (va[j]>va[i-1]||k==n-1)?dp[i][j-1]:-1,
                (va[i]>va[j+1]||k==n-1)?dp[i+1][j]:-1 );
            else
                dp[i][j]=max(dp[i+1][j]+va[i],dp[i][j-1]+va[j]);
        }
    }

    for(int i=1;i<=n;i++)ans=max(dp[i][i+n-1],ans);
    cout<<ans<<endl;    
}

完结撒花!

可惜如此冷门の题(3.20了,我还是2020年第一个做的)大概不会有几个人能看到私の题解了。

でも,不能放任无题解のAT题目不管啊。