传送门:https://www.luogu.org/problemnew/show/U29999
题目大意:给一个长度为
N
N
N的数列,每个数可以跟与它相邻的数字组队,并全部变成队伍中最大的数字,一个队最多有
K
K
K个数字,求组队后数列最大和。
思路:
d
p
dp
dp,
f
(
i
)
=
m
a
x
(
f
[
j
−
1
]
+
m
a
x
(
a
[
t
]
)
∗
(
i
−
j
+
1
)
)
(
m
a
x
(
1
,
i
−
k
+
1
)
<
j
<
=
i
,
j
<
=
t
<
=
i
)
f(i)=max(f[j-1]+max(a[t])*(i-j+1))(max(1,i-k+1)<j<=i,j<=t<=i)
f(i)=max(f[j−1]+max(a[t])∗(i−j+1))(max(1,i−k+1)<j<=i,j<=t<=i),
m
a
x
(
a
[
t
]
)
max(a[t])
max(a[t])可以在循环时
O
(
1
)
O(1)
O(1)求出,复杂度为
O
(
N
K
)
O(NK)
O(NK)。
代码:
#include <bits/stdc++.h>
using namespace std;
const int M=1e4+10;
int n,k,a[M],f[M];
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>a[i];
f[1]=a[1];
for(int i=2;i<=n;i++){
int maxa=a[i];
for(int j=i;j>=max(1,i-k+1);j--){
maxa=max(maxa,a[j]);
f[i]=max(f[i],f[j-1]+maxa*(i-j+1));
}
}
printf("%d\n",f[n]);
return 0;
}