题目
传送门:QWQ
分析
dp基础题。
$ dp[i][j] $表示前i个数分成j组的最大和。
转移显然。
吐槽:做cf题全靠洛谷翻译苟活。
代码
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn=5010; 5 ll dp[maxn][maxn], sum[maxn], a[maxn]; 6 ll Sum(int l,int r){/* printf("---%d %d ",l,r);*/ return sum[r]-sum[l-1];} 7 int main(){ 8 int n,m,k; scanf("%d%d%d",&n,&m,&k); 9 for(int i=1;i<=n;i++){ 10 scanf("%I64d",&a[i]); sum[i]=sum[i-1]+a[i]; 11 } 12 for(int j=1;j<=k;j++){ 13 for(int i=1;i<=n;i++){ 14 dp[i][j]=dp[i-1][j]; 15 if(i>=m ) dp[i][j]=max(dp[i][j],dp[i-m][j-1]+Sum(i-m+1,i)); 16 } 17 } 18 printf("%I64d ",dp[n][k]); 19 return 0; 20 }