您的位置:首页 > 其它

UVALive 6510 Stickers

2015-07-20 14:14 309 查看
这道题当时没有写题解,这算是一个水dp吧

就给你一个2*n的格子,然后不能取相邻的边的邮票

那么当前的转台只能从自己的前面的左上角和左上角的左面一个格子推出来,最后求第一行和第二行得到的最大值

[code]#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]
,dp[1]
));
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: