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])); } }