题解:CF1969C Minimizing the Sum
CF1969C 题目传送门
题目大意
有一个长度为
解决思路
首先来看一个例子:例如,如果
接下来很容易想到区间 dp。
求解:对整个问题设最优值,枚举合并点,将问题分解为左右两个部分,最后合并两个部分的最优值得到原问题的最优值。
我们定义
最终得到的
预处理
代码展示
这段代码通过动态规划的方法,计算在最多进行
#include<iostream>
#define ll long long
using namespace std;
const int N=3e5+10;
ll T,n,k,a[N],p[N][15],ans[N][15];
int main()
{
cin>>T;
while(T--)
{
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
p[i][0]=a[i];
}
for(int j=1;j<=k;j++)
for(int i=1;i+j<=n;i++)
p[i][j]=min(p[i][j-1],(ll)a[i+j]);
for(int j=1;j<=k;j++)
for(int i=1;i+j<=n;i++)
p[i][j]*=(j+1);
for(int i=1;i<=n;i++)
{
ans[i][0]=ans[i-1][0]+a[i];
for(int j=1;j<=k;j++)
{
ans[i][j]=min(ans[i-1][j]+a[i],ans[i][j-1]);
for(int h=0;h<i&&h<=j;h++)
ans[i][j]=min(ans[i][j],ans[i-h-1][j-h]+p[i-h][h]);
}
}
cout<<ans[n][k]<<endl;
}
return 0;
}