alg2025/src/8/26/P5424.cpp
2025-08-26 16:11:12 +08:00

68 lines
1.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
dp[i][j]
前i组蛇用j个网的最小浪费空间
dp[i][j]=min(dp[i][j],dp[m][j-1]+cnt[m+1][i])
dp[i][j]=1e9
dp[0][0]=0
*/
#include <algorithm>
#include <cstdint>
#include <cstdio>
#include <iostream>
#include <istream>
#include <vector>
using ll = int64_t;
#define p2v(dp)do{\
for(ll i=0;i<dp.size();i++){\
for(ll j=0;j<dp[i].size();j++){\
printf("[%lld][%lld]=%lld\n",i,j,dp[i][j]);\
}\
}\
}while(0)
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
ll n,m;
std::cin>>n>>m;
m++;
std::vector<ll> v(n+1);
std::vector<std::vector<ll>> cnt(n+1,std::vector<ll>(n+1));//cnt[i][j]=i-j用一个网浪费的空间
std::vector<std::vector<ll>> dp(n+1,std::vector<ll>(m+1, 1e9));
dp[0][0]=0;
for(ll i=1;i<=n;i++){
std::cin>>v[i];
}
for(ll i=1;i<=n;i++){
for(ll j=i;j<=n;j++){
ll nmax = *std::max_element(v.begin()+i,v.begin()+j+1);
ll ncnt=0;
for(ll m=i;m<=j;m++){
ncnt+=nmax-v[m];
}
cnt[i][j]=ncnt;
}
}
// printf("cnt\n");
// p2v(cnt);
for(ll i=1;i<=n;i++){
dp[i][1]=cnt[1][i];
for(ll j=2;j<=m&&j<=i;j++){
for(ll k=j-1;k<i;k++){
dp[i][j]=std::min(dp[i][j],dp[k][j-1]+cnt[k+1][i]);
}
}
}
// printf("dp\n");
// p2v(dp);
std::cout<<dp[n][m]<<"\n";
}