E21 线性DP 大盗阿福

视频链接:https://www.bilibili.com/video/BV1TK4y1E7ft/

// 分步转移
#include<iostream>
using namespace std;

const int N=100010;
int w[N],f[N];

int main(){
  int n,t; scanf("%d",&t);
  while(t--){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&w[i]);
    
    f[0]=0; f[1]=w[1];
    for(int i=2; i<=n; i++)
      f[i]=max(f[i-1],f[i-2]+w[i]);
    
    printf("%d\n", f[n]);
  }
}

 

// 分类转移
#include<iostream>
using namespace std;

const int N = 100010;
int w[N],f[N][2]; 

int main(){
  int n,t; scanf("%d", &t);
  while(t--){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&w[i]);
    
    f[1][0]=0; f[1][1]=w[1];
    for(int i=2; i<=n; i++){
      f[i][0]=max(f[i-1][0],f[i-1][1]);
      f[i][1]=f[i-1][0]+w[i];
    }
    printf("%d\n",max(f[n][0],f[n][1]));
  }
}

 

posted @ 2023-04-10 10:06  董晓  阅读(374)  评论(0编辑  收藏  举报