求助区间dp
查看原帖
求助区间dp
67618
haooo楼主2021/3/15 17:59
#include<bits/stdc++.h>
using namespace std;
const int N=205;
template<typename T>
inline void read(T &x){
    x=0; bool f=0;char ch=getchar();
    while(ch<'0'||ch>'9'){f|=ch=='-';ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    x=f?-x:x;
}
template<typename T>
inline void print(T x){
    if(x<0) x=-x,putchar('-');
    if(x>9) print(x/10);
    putchar(x%10+'0');
}

int a[N],dp1[N][N],dp2[N][N],sum[N];
int n,minn=0x7fffffff,maxn=0;

int main(){
    read(n);
    for(int i=1;i<=n;i++) read(a[i]),a[i+n]=a[i];
    for(int i=1;i<=2*n;i++) sum[i]=sum[i-1]+a[i];
    memset(dp1,0x3f,sizeof(dp1));
    // cout<<dp1[0][0];
    for(int i=1;i<=n;i++) dp1[i][i]=0;
    for(int len=2;len<=n;len++)
        for(int i=1;i<=2*n-len+1;i++){
            int j=i+len-1;
            for(int k=i;k<j;k++){
                dp1[i][j]=min(dp1[i][j],dp1[i][k]+dp1[k+1][j]+sum[j]-sum[i-1]);
                dp2[i][j]=max(dp2[i][j],dp2[i][k]+dp2[k+1][j]+sum[j]-sum[i-1]);
            }
        }
    for(int i=1;i<=n;i++) minn=min(minn,dp1[i][i+n-1]),maxn=max(maxn,dp2[i][i+n-1]);
    print(minn),puts(""),print(maxn);
    return 0;
}

2021/3/15 17:59
加载中...