UVALive 6510 Stickers

这道题当时没有写题解,这算是一个水dp吧
就给你一个2*n的格子,然后不能取相邻的边的邮票
那么当前的转台只能从自己的前面的左上角和左上角的左面一个格子推出来,最后求第一行和第二行得到的最大值

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int dp[2][111111];
int a[2][111111];
int n;

int main (){
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        for(int j=0;j<=1;j++)
        for(int i=1;i<=n;i++){
            scanf("%d",&a[j][i]);
        }

        memset(dp,0,sizeof(dp));
        dp[0][1]=a[0][1];
        dp[1][1]=a[1][1];
        a[0][0]=0;
        a[1][0]=0;
        for(int i=2;i<=n;i++){
            dp[1][i]=max(dp[1][i],dp[0][i-1]+a[1][i]);
            dp[1][i]=max(dp[1][i],dp[0][i-2]+a[1][i]);
            dp[0][i]=max(dp[0][i],dp[1][i-1]+a[0][i]);
            dp[0][i]=max(dp[0][i],dp[1][i-2]+a[0][i]);
        }

        printf("%d\n",max(dp[0][n],dp[1][n]));
    }
}

你可能感兴趣的:(dp)