mirror of
https://gitcode.com/Zengtudor/alg2025.git
synced 2025-09-08 11:10:36 +00:00
68 lines
1.4 KiB
C++
68 lines
1.4 KiB
C++
/*
|
||
|
||
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";
|
||
} |