Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- typedef long long int ll;
- ll const inf = 1e18;
- ll max(ll a,ll b){
- return (a > b ? a : b);
- }
- int main()
- {
- int n,K,m;
- scanf("%d %d %d",&n,&K,&m);
- ll arr[n+1];
- ll qs[n+1];qs[0] = 0;
- arr[0] = 0;
- for(int i = 1 ; i <= n ; i ++){
- scanf("%lld",&arr[i]);
- qs[i] = qs[i-1] + arr[i];
- }
- ll dp[n+1][2];
- for(int i = 0 ; i <= 1 ; i ++)dp[0][i] = -inf;
- for(int i = 0 ; i <= n ; i ++)dp[i][0] = qs[i];
- for(int k = 1 ; k <= K ; k ++){
- ll maxPrefix = -inf;
- if(k == 2)dp[0][k%2] = -inf;
- for(int I = 1 ; I <= n ; I ++){
- ll ans = dp[I-1][k%2] + arr[I];
- // printf("skiped %lld : (%lld + %lld) = %lld\n",I,dp[I-1][k],arr[I],ans);
- if(I-m+1 >= 1){
- maxPrefix = max(maxPrefix,((I-m+1)-2 >= 0 ? dp[(I-m+1)-2][(k+1)%2] : dp[0][(k+1)%2]) + arr[I-m]);//dp[(I-m+1)-2])
- }
- // printf("Test (%lld,%lld) : ans = max(%lld,%lld)\n",maxPrefix,ans);
- ans = max(maxPrefix,ans);
- // printf("Test (%lld,%lld) : %lld\n",I,k,ans);
- dp[I][k%2] = ans;
- // printf("%lld ",dp[I][k%2]);
- }
- // printf("\n");
- }
- printf("%lld",dp[n][K%2]);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement