WA90悬7关求调
查看原帖
WA90悬7关求调
658762
sxq9楼主2025/8/5 15:16
#include<bits/stdc++.h>
#define int long long
using namespace std;
int dp[520][520],a[520],pre[520],cb[520][520];
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n,m,ans=114514191981000;
    cin>>n>>m;
    for(int i=2;i<=n;i++){
        cin>>a[i];
        pre[i]=pre[i-1]+a[i];
        // cout<<pre[i]<<' ';
    }
    // cout<<endl;
    for(int i=1;i<=n;i++){
        // cout<<i<<':';
        for(int j=i+1;j<=n;j++){
            for(int k=i;k<=j;k++){
                cb[i][j]+=min(pre[k]-pre[i],pre[j]-pre[k]);
            }
            // cout<<cb[i][j]<<' ';
        }
        // cout<<endl;
    }
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++)cb[i][n+1]+=pre[j]-pre[i];
    }
    memset(dp,0x3f,sizeof(dp));
    for(int i=1;i<=n;i++){
        dp[i][1]=0;
        for(int j=1;j<=i;j++){
            dp[i][1]+=pre[i]-pre[j];
        }
    }
    dp[1][0]=0;
    for(int i=1;i<=n;i++){
        for(int j=2;j<=min(i,m);j++){
            for(int k=1;k<i;k++){
                dp[i][j]=min(dp[i][j],dp[k][j-1]+cb[k][i]);
            }
            if(j==m||(j==i&&i<m))ans=min(ans,dp[i][j]+cb[i][n+1]);
            //if(...) dp[i][j]+=pre[n]-pre[i];
            // cout<<i<<' '<<j<<' '<<dp[i][j]<<endl;
        }
    }
    cout<<ans;
    return 0;
}//dp[i][j]->当前i要建,用了j所(min)上一个在k的最小值
2025/8/5 15:16
加载中...