B. Snakes
题目描述
Bessie打算用网来捕n组蛇,且只能从第一组开始捕。一开始她可以设置网的容量,且她有k次修改容量的机会,求浪费的容量的最小值。
题目分析
#参考了博客
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3F3F3F3F;
ll sna[402],waste[402][402],dp[402][402];//前代表第i组,后代表第j次变化
int main(){
int n,m;
scanf("%d%d",&n,&m);
m++;//开始的一次
for(int i=1;i<=n;i++)
scanf("%d",sna+i);
for(int i=1;i<=n;i++){
ll temp_sum=0,temp_max=-1;
for(int j=i;j<=n;j++){//求[i,j]区间浪费的空间
temp_sum+=sna[j];
temp_max=max(temp_max,sna[j]);
waste[i][j]=temp_max*(j-i+1)-temp_sum;
}
}
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++)
dp[i][j]=INF;
dp[0][0]=0;
for(int k=1;k<=m;k++){
for(int i=1;i<=n;i++){
for(int j=0;j<i;j++){
dp[i][k]=min(dp[i][k],dp[j][k-1]+waste[j+1][i]);
}
}
}
printf("%lld\n",dp[n][m]);
}