区间dp(直线石子合并)

#include<bits/stdc++.h>
using namespace std;
const int INF=1<<30;
int N,dpx[110][110],dpi[110][110],sum[110];

void sol(){
    for(int i=1;i<=N;i++) dpx[i][i]=dpi[i][i]=0;
    for(int len=2;len<=N;len++){
        for(int i=1;i<=N-len+1;i++){
            int j=i+len-1;
            int min=INF,max=0;
            for(int k=i;k<j;k++){
                min=(dpi[i][k]+dpi[k+1][j]<min)?dpi[i][k]+dpi[k+1][j]:min;
                max=(dpx[i][k]+dpx[k+1][j]>max)?dpx[i][k]+dpx[k+1][j]:max;
            }
            dpx[i][j]=max+sum[j]-sum[i];
            dpi[i][j]=min+sum[j]-sum[i];
        }  
    }
}

int main(){
    cin>>N;
    sum[0]=0;
    for(int i=1;i<=N;i++){
        cin>>sum[i];
        sum[i]+=sum[i-1];
    }
    sol();
    cout<<dpi[1][N]<<endl<<dpx[1][N]<<endl;
    return 0;
}
posted @ 2025-10-16 10:18  sadmax11  阅读(2)  评论(0)    收藏  举报