题目描述
有一个长度为 NN 整数数列 A=(A_1,A_2,...,A_N)A=(A1,A2,...,AN) 。
现在假设有一个长度为 MM 的序列 BB ,并且 BB 是 AA 的子序列。请找到 \sum_{i=1}^M i\times B_i∑i=1Mi×Bi 的最大值。
输入格式
输入按照下面的标准格式给出:
N\ M \newline A_1 \ A_2 \ \dots\ A_NN MA1 A2 … AN
输出格式
一个整数,表示\sum_{i=1}^M i\times B_i∑i=1Mi×Bi 的最大值。
样例 #1
样例输入 #1
4 2
5 4 -1 8
Copy
样例输出 #1
21
Copy
样例 #2
样例输入 #2
10 4
-3 1 -4 1 -5 9 -2 6 -5 3
Copy
样例输出 #2
54
Copy
说明 / 提示
注意事项
若序列 SS 是长度为 LL 的数列 TT 的子序列,则 SS 是数列 TT 删除任意 i\ (i\in [0,L])i (i∈[0,L]) 个元素得到的。
比如说, (10,30)(10,30) 是 (10,20,30)(10,20,30) 的字串,但是 (20,10)(20,10) 不是。
数据范围
- 1\le M\le N\le 20001≤M≤N≤2000
- -2\times 10^5\le A_i\le 2\times 10^5−2×105≤Ai≤2×105
- 所有输入数据均为整数
样例解释
对于样例一,当 B=(A_1,A_4)B=(A1,A4) 时,\sum_{i=1}^M i\times B_i=1\times 5+2\times 8=21∑i=1Mi×Bi=1×5+2×8=21 。因为不可能达到 22 或者更大的值,所以答案是 21 。
思路
通过观察我们可以发现,对于每一个值,只有加和不加两种选择,那么我们就可以利用一个三维数组存储当前数值(z[从一到i][第j个值][有无])。
代码见下:
#include<bits/stdc++.h>
using namespace std;
long long int d=1e7;
long long int f[3001][3001][3];
long long int z[10000000],sd,g[10000000],o[10000000],uss[1001][1001];
long long int n,m,mo=1e9+7;
long long int s=1;
long long int sf=1,sg=s,sh,tt=9e8,l;
int main(){
cin>>n>>m;
memset(f,-10,sizeof(f));
for(int i=1;i<=n;i++){
cin>>z[i];
f[i][0][0]=0;
f[i][0][1]=0;
}
f[0][0][0]=0;
f[0][0][1]=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m&&j<=i;j++){
f[i][j][1]=max(f[i-1][j-1][1],f[i-1][j-1][0])+z[i]*j;
f[i][j][0]=max(f[i-1][j][1],f[i-1][j][0]);
}
}
cout<<max(f[n][m][1],f[n][m][0]);
}