Gray code---hdu5375(格雷码与二进制码,普通dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5375

题意就是:给你一串二进制码,里面可能含有'?'这个既可以表示0又可以表示1,

让我们把这个二进制串转成格雷码串,转换之后的串中如果第 i 位为 1 那么就加上对应给出的a[i],求最大加的结果ans;

例如:

00?0

1 2 4 8

二进制串可以是      0000或者0010

转化成格雷码之后是0000或者0011

0000价值总和为0;

0011的价值总和为a[3]+a[4]=12;

dp[i][j]表示二进制第i位为j时的最大价值。同时应该注意初始化。

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
#define N 200020
#define INF 0xfffffff

int a[N], dp[N][2];
char s[N];

int main()
{
    int T, n, t=1;
    scanf("%d", &T);
    while(T--)
    {
        memset(s, 0, sizeof(s));
        memset(a, 0, sizeof(a));
        memset(dp, 0, sizeof(dp));
        scanf("%s", s);
        n=strlen(s);
        for(int i=0; i<n; i++)
        {
            scanf("%d", &a[i]);
            dp[i][0] = dp[i][1] = -INF;
        }
        if(s[0]=='0' || s[0]=='?') dp[0][0] = 0;
        if(s[0]=='1' || s[0]=='?') dp[0][1] = a[0];
        for(int i=1; i<n; i++)
        {
            if(s[i]=='0' || s[i]=='?')
                dp[i][0] = max(dp[i-1][0], dp[i-1][1]+a[i]);
            if(s[i]=='1' || s[i]=='?')
                dp[i][1] = max(dp[i-1][1], dp[i-1][0]+a[i]);
        }
        int ans=max(dp[n-1][0], dp[n-1][1]);
        printf("Case #%d: %d
", t++, ans);
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/zhengguiping--9876/p/4953659.html