定义dp[i]为以i结尾数组的最大总和,则需要求dp[n-1]
可以从边界开始推 当只有一个数时dp[0]=a[0]
有两个数时 可以选择删2 或者不删 即dp[1]=max(0,a[0]+a[1])
有三个数时 可以选择删3 对应0 ,删2:删a[1]和a[2] 剩下a[0](就是dp[0]),不删 就是dp[2-1]+a[2]
有四个数时,即i=3 删3对应dp[3-3]=dp[0],删2:dp[3-2]=dp[1],不删就是dp[3-1]+a[3];
可以推出 当n>3时
dp[i]=max(dp[i-3],max(dp[i-2],dp[i-1]+a[i])); 详细见代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve(){
int dp[200100],a[200100];
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
dp[0]=a[0];//只能是自己
dp[1]=max(0ll,a[0]+a[1]);//删2 或者不删的最大值
dp[2]=max(0ll,max(dp[1]+a[2],dp[0]));//删3 ->0 或者不删 ->dp[1]+a[2] 或者删2 ->dp[0]
for(int i=3;i<n;i++){
dp[i]=max(dp[i-3],max(dp[i-1]+a[i],dp[i-2]));
}
cout<<dp[n-1]<<endl;
}
signed main() {
int t;
cin>>t;
while(t--){
solve();
}
}



京公网安备 11010502036488号