定义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();
   }
}