思路:
因为题面已经说了是连续的, 所以就可以用一个线性的dp。
设dp[i]
以
i
i
i结尾的包装能力之和的最大值。
设一个sum为
dp[i]~
dp[j]`包装能力的最大值。
然后状态转移方程就是:
d
p
[
j
]
=
M
a
x
(
d
p
[
j
]
,
d
p
[
i
−
1
]
+
(
j
−
i
+
1
)
∗
s
u
m
)
;
dp[j] = Max(dp[j] , dp[i - 1] + (j - i + 1) * sum);
dp[j]=Max(dp[j],dp[i−1]+(j−i+1)∗sum);
code:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 10005;
int dp[maxn] , s[maxn];
int sum;
int n , k;
int Max(int x, int y) {
return x > y ? x : y;
}
int main() {
// freopen("worker.in", "r", stdin);
// freopen("worker.out", "w", stdout);
scanf("%d %d", &n, &k);
for(int i = 1;i <= n;i ++) {
scanf("%d", &s[i]);
}
for(int i = 1;i <= n;i ++) {
sum = 0;
for(int j = i;j < min(i + k , n + 1);j ++) {
sum = Max(s[j] , sum);//求出最高的
dp[j] = Max(dp[j] , dp[i - 1] + (j - i + 1) * sum);//更新
}
}
printf("%d", dp[n]);
return 0;
}
}