40分记忆化求调
查看原帖
40分记忆化求调
554231
Jayling楼主2025/6/30 14:53
#include <bits/stdc++.h>
#define int long long
using namespace std;
pair<int,int> operator+(const pair<int,int>& a,const pair<int,int>& b){
    return {a.first+b.first,a.second+b.second};
}
pair<int,int> operator+(const pair<int,int>& a,const int& x){
    return {a.first+x,a.second+x};
}
int n;
const int MAXN = 210;
int a[MAXN];
int sum[MAXN];
pair<int,int> dp[MAXN][MAXN];
//1 min
//2 max
pair<int,int> dfs(int l,int r){
    if(l>r){
        return {0,0};
    }
    if(l==r){
        return {0,0};
    }
    if(l+1==r){
        return {a[l]+a[r],a[l]+a[r]};
    }
    if(dp[l][r].first!=-1){
        return dp[l][r];
    }
    int res1=INT_MAX;
    int res2=0;
    for(int k=l+1;k<r;k++){
        pair<int,int> exp = dfs(l,k)+dfs(k+1,r)+(sum[r]-sum[l-1]);
        res1 = min(res1,exp.first);
        res2 = max(res2,exp.second);
    }
    dp[l][r]={res1,res2};
    return dp[l][r];
}
inline void run(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        a[i+n]=a[i];
    }
    for(int i=1;i<=2*n;i++){
        sum[i]=sum[i-1]+a[i];
    }
    for(int i=0;i<=2*n;i++){
        for(int j=0;j<=2*n;j++){
            dp[i][j]={-1,-1};
        }
    }
    int min_val=INT_MAX;
    int max_val=0;
    for(int i=1;i<=n;i++){
        pair<int,int> ans = dfs(i,i+n-1);
        min_val = min(min_val,ans.first);
        max_val = max(max_val,ans.second);
    }
    cout<<min_val<<'\n'<<max_val;
    return ;
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    // freopen("test.in","r",stdin);
    int T=1;
    while(T--){
        run();
    }

    return 0;
}
2025/6/30 14:53
加载中...