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; }
浙公网安备 33010602011771号