决策单调性求助悬5r
  • 板块学术版
  • 楼主rand_Zq
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/20 14:56
  • 上次更新2024/8/20 15:05:56
查看原帖
决策单调性求助悬5r
901086
rand_Zq楼主2024/8/20 14:56

CF321E

#include<bits/stdc++.h>
using namespace std;
const int N=4e3+5;
int n,m,a[N][N],dp[805][N],pos[805][N];
int w(int l,int r){
    return a[r][r]-a[r][l-1]-a[l-1][r]+a[l-1][l-1];
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>a[i][j],a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1]+a[i][j];
        }
    }
    for(int i=1;i<=n;i++){
        dp[1][i]=w(1,i),pos[1][i]=i;
    }
    for(int k=2;k<=m;k++){
        pos[k][n+1]=n;
        for(int i=n;i>=1;i--){
            dp[k][i]=2e9;
            for(int j=max(2,pos[k-1][i]);j<=pos[k][i+1];j++){
                if(dp[k-1][j-1]+w(j,i)<dp[k][i]){
                    dp[k][i]=dp[k-1][j-1]+w(j,i),pos[k][i]=j;
                }
            }
        }
    }
    cout<<dp[m][n]/2;
}
2024/8/20 14:56
加载中...