解题报告:
自己也是看题解补出来的,当时没想到 dp 求解。
d p [ i ] = m a x ( d p [ i − 1 ] , d p [ i − j ] + j ∗ M A X ) , 其 中 M A X = m a x ( a [ i − 0 ] , a [ i − 1 ] , . . . . . , a [ i − j + 1 ] ) dp[i] = max(dp[i-1],dp[i-j]+j*MAX),其中MAX=max(a[i-0],a[i-1],.....,a[i-j+1]) dp[i]=max(dp[i−1],dp[i−j]+j∗MAX),其中MAX=max(a[i−0],a[i−1],.....,a[i−j+1])
可以理解为 d p [ i ] dp[i] dp[i]表示前 i i i 安排分组后的最大值, j j j 表示 枚举最后一个分组的大小。
#include<bits/stdc++.h>
#define LL long long
#define pii pair<int,int>
#define all(x) x.begin(),x.end()
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn=1e5+5;
const LL MOD=199999;
inline int read() {
int s = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {f = -1;ch = getchar();}
while (ch >= '0' && ch <= '9') {s = (s << 1) + (s << 3) + ch - '0';ch = getchar();}
return s * f;
}
inline void write(int x) {
if (x < 0) x = -x, putchar('-');
if (x > 9) write(x / 10);
putchar(x % 10 + '0');
}
int a[maxn],n,k;
int dp[maxn];
int main() {
n=read(),k=read();
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=n;i++){
int Max=a[i];
for(int j=i,p=0;j-p>=1&&p<k;p++){
Max=max(Max,a[j-p]);
dp[i]=max(dp[i],dp[j-p-1]+Max*(p+1));
}
}
printf("%d\n",dp[n]);
return 0;
}