C. Minimizing the Sum
题解
对于区间,其末尾,要么没有操作过,要么被最后一个元素往前操作,要么被前面的元素往后操作
code
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[300005];
ll dpl[300005][15]={0}, dpr[300005][15]={0}, dp[300005][15]={0};
int main()
{
//ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
ll t;
cin>>t;
while(t--)
{
ll n, k;
cin>>n>>k;
ll sum=0;
for(ll i=1; i<=n; i++)
{
cin>>a[i];
sum+=a[i];
}
for(ll i=1; i<=n; i++)
{
for(ll j=1; j<=k; j++)
{
if(i-j<=0) break;
dpl[i][j]=dpl[i][j-1]+a[i-j]-a[i];
}
}
for(ll i=n; i>=1; i--)
{
for(ll j=1; j<=k; j++)
{
if(i+j>n) break;
dpr[i][j]=dpr[i][j-1]+a[i+j]-a[i];
}
}
ll ans=0;
for(int i=2;i<=n;i++)
{
for(int len=0;len<=k&&len<i;len++)
{
dp[i][len]=0;
for(int r=0;r<=len;r++)
{
dp[i][len]=max(dp[i][len],dp[i-r][len-r]+dpr[i-r][r]);
dp[i][len]=max(dp[i][len],dp[i-r-1][len-r]+dpl[i][r]);
}
ans=max(ans,dp[i][len]);
}
}
cout<<sum-ans<<'\n';
}
return 0;
}

浙公网安备 33010602011771号