D - Index × A(Not Continuous ver.) Editorial by en_translator
Unlike problem C, in this problem there are \(\binom{N}{M}\) possible subsequences, so it is far impossible to try all the subsequences naively.
That’s why we use DP (Dynamic Programming). It is defined as follows:
- The maximum value of \(\displaystyle \sum_{k=1}^{j} k \times B_k\) when choosing \(j\) elements for \(B\) from the elements from \(A_1\) to \(A_i\).
The transition goes as follows:
- \(\mathrm{dp}[i][j]=\max(\mathrm{dp}[i-1][j],\mathrm{dp}[i-1][j-1]+j \times A_i)\)
\(\mathrm{dp}[i-1][j]\) corresponds to when \(A_i\) is not chosen as an element of \(B\), and \(\mathrm{dp}[i-1][j-1]+j \times A_i\) to when \(A_i\) is chosen as the \(j\)-th element of \(B\).
The answer is \(\mathrm{dp}[N][M]\). The complexity is \(\mathrm{O}(NM)\).
For this problem also, note that the solution may not fit in 32-bit integer type. Be careful of handling \(\mathrm{dp}[i][j]\) when \(i > j\).
Sample code (C++)
#include <bits/stdc++.h>
using namespace std;
long long dp[2001][2001];
int main(){
int n,m;
cin>>n>>m;
vector<long long> a(n);
for(int i=0;i<n;i++) cin>>a[i];
dp[0][0]=0;
dp[0][1]=-1000000000000000000ll;
for(int i=1;i<=n;i++){
for(int j=0;j<=n;j++){
if(j==0) dp[i][0]=0;
else if(j>i) dp[i][j]=-1000000000000000000ll;
else dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]+a[i-1]*j);
}
}
cout<<dp[n][m]<<endl;
}
posted:
last update: