神题。。。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
int save[4100];
int n,m,dp[2100][2100][2];
int d2[200005][100],a[200005];
int Min(int a,int b)
{
return a>b?b:a;
}
int Max(int a,int b)
{
return a>b?a:b;
}
void init()
{
int k=(int)log2(n);
for(int i=1;i<=n;i++)
d2[i][0]=save[i];
for(int j=1;j<=k;j++)
{
for(int i=1;i+(1<<(j-1))<=n;i++)
d2[i][j]=Max(d2[i][j-1],d2[i+(1<<(j-1))][j-1]);
}
}
int RMQ(int l,int r)
{
if(r<l) return 0;
int k=(int)log2(r-l+1);
int MAX = Max(d2[l][k],d2[r-(1<<k)+1][k]);
return MAX;
}
inline int ReadInt()
{
int flag=0;
char ch = getchar();
int data = 0;
while (ch < '0' || ch > '9')
{
if(ch=='-') flag=1;
ch = getchar();
}
do
{
data = data*10 + ch-'0';
ch = getchar();
}while (ch >= '0' && ch <= '9');
if(flag) data=-data;
return data;
}
int main()
{
n=ReadInt();
m=ReadInt();
int ans=0;
for(int i=1;i<=n;i++)
{
save[i]=ReadInt();
ans+=save[i];
}
init();
dp[0][0][1]=0;
dp[0][0][0]=0;
for(int i=0;i<=n;i++)
{
for(int j=0;j<=(n-i);j++)
{
if(i==0&&j==0) continue;
int maxn = 0;
maxn=RMQ(1+m+i,n-m-j);
if (i >0)
dp[i][j][0]=Min(dp[i-1][j][0]+maxn,dp[i-1][j][1]+maxn*(i+j) );
else
dp[i][j][0]=0x3f3f3f3f;
maxn=RMQ(1+m+i+1,n-m-j+1);
if (j >0 )
dp[i][j][1]=Min(dp[i][j-1][1]+maxn ,dp[i][j-1][0]+maxn*(i+j) );
else
dp[i][j][1]=0x3f3f3f3f;
}
}
int tmp=0x3f3f3f3f;
for(int i=0;i<=n;i++)
{
tmp=Min(tmp,Min(dp[i][n-i][0],dp[i][n-i][1]));
}
printf("%d\n",tmp+ans);
return 0;
}