区间dp的疑惑
查看原帖
区间dp的疑惑
766675
da_ke楼主2023/7/5 22:34
#include <bits/stdc++.h>
#define rep(i,l,r) for(int i=l;i<=r;++i)

using namespace std;

int a[301],n,sum[301];
int mem1[301][301],mem2[301][301];
const int INF=1<<30;

int dfs1(int l,int r){
    if(mem1[l][r]!=-1)
        return mem1[l][r];
    if(l==r) 
        return 0;
    int ans=INF;
    rep(k,l,r-1) //这里为啥要减一?
        ans=min(ans,dfs1(l,k)+dfs1(k+1,r)+sum[r]-sum[l-1]);
    return mem1[l][r]=ans;
}

int dfs2(int l,int r){
    if(mem2[l][r]!=-1)
        return mem2[l][r];
    if(l==r) 
        return 0;
    int ans=0;
    rep(k,l,r-1)
        ans=max(ans,dfs2(l,k)+dfs2(k+1,r)+sum[r]-sum[l-1]);
    return mem2[l][r]=ans;
}

int main(){
    ios::sync_with_stdio(false);
    memset(mem1,-1,sizeof(mem1));
    memset(mem2,-1,sizeof(mem2));

    cin>>n;
    rep(i,1,n){
        cin>>a[i];
        a[i+n]=a[i];
    }
    rep(i,1,2*n)
        sum[i]=sum[i-1]+a[i];
    int minn=INF,maxn=0;
    rep(i,1,n){
        minn=min(dfs1(i,i+n-1),minn);
        maxn=max(dfs2(i,i+n-1),maxn);
    }
    cout<<minn<<endl<<maxn;
}
2023/7/5 22:34
加载中...