B. Array Walk

https://codeforces.com/contest/1389/problem/B

题意:给出一个数组a[],起点在第一个数,每次移动加分为落脚出的数,总共可以移动k步,最多向左移动z步,求一个最大分数。

可用dp,感觉自己不太熟练。dp[i][j]表示当前在第i个数,向左走了j步,已走k步时,i-1+2*j==k.

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e5+7;
const int N=1e5+5;
int dp[N][6],a[N];

int main(){
    int t;cin>>t;
    while(t--){
        int n,k,z;cin>>n>>k>>z;
        int ans=0;
        for(int i=1;i<=n;i++){
            cin>>a[i];
        }
        dp[1][0]=a[1];
        for(int i=2;i<=n;i++)
        for(int j=0;j<=z;j++){
            dp[i][j]=dp[i-1][j]+a[i];
            if(i-1+2*j==k) ans=max(ans,dp[i][j]);
            if(j+1<=z)
            dp[i-1][j+1]=max(dp[i-1][j+1],dp[i][j]+a[i-1]);
            if(i-1-1+2*(j+1)==k) ans=max(ans,dp[i-1][j+1]);
        }
        memset(dp,0,sizeof(dp));
        cout<<ans<<endl;
    }
    return 0;
}

 

posted @ 2020-07-31 00:07  asunayi  阅读(214)  评论(0)    收藏  举报