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\n", t++, ans);
    }
    return 0;
}

时间: 2024-10-05 10:04:23

Gray code---hdu5375(格雷码与二进制码,普通dp)的相关文章

leetCode 89.Gray Code (格雷码) 解题思路和方法

The gray code is a binary numeral system where two successive values differ in only one bit. Given a non-negative integer n representing the total number of bits in the code, print the sequence of gray code. A gray code sequence must begin with 0. Fo

[C++]LeetCode: 86 Gray Code (格雷码)

题目: The gray code is a binary numeral system where two successive values differ in only one bit. Given a non-negative integer n representing the total number of bits in the code, print the sequence of gray code. A gray code sequence must begin with 0

格雷码与二进制码的转换

Gray Code是1880年由法国工程师Jean-Maurice-Emlle Baudot发明的一种编码,是一种绝对编码方式,典型格雷码是一种具有反射特性和循环特性的单步自补码,它的循环.单步特性消除了随机取数时出现重大误差的可能,它的反射.自补特性使得求反非常方便.格雷码属于可靠性编码,是一种错误最小化的编码方式,因为,虽然自然二进制码可以直接由数/模转换器转换成模拟信号,但在某些情况,例如从十进制的3转换为4时二进制码的每一位都要变,能使数字电路产生很大的尖峰电流脉冲.而格雷码则没有这一缺

【LeetCode-面试算法经典-Java实现】【089-Gray Code(格雷码)】

[089-Gray Code(格雷码)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 The gray code is a binary numeral system where two successive values differ in only one bit. Given a non-negative integer n representing the total number of bits in the code, print the sequen

格雷码与二进制码互相转换

参考百科:http://baike.baidu.com/link?url=mr53i-76Ue3cGMnqWwG_lam8Zfwbfhdk8JnHEHhEU0nfzpIZ8l583KdcTIahIQIoSTYtL02DpWnt4goCByUQ9a 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码. 二进制码→格雷码(编码): 此方法从对应的n位二进制码字中直接得

格雷码与二进制码转化成格雷码

在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),格雷码由0和1组成,由二进制码演化而成. 格雷码生成方法如下: 1位格雷码有两个码字 (n+1)位格雷码中的前2n个码字等于n位格雷码的码字,按顺序书写,加前缀0 (n+1)位格雷码中的后2n个码字等于n位格雷码的码字,按逆序书写,加前缀1 举例如下: 1位格雷码: 0 1 2位格雷码: 总共有2^2个码字,前一半的码字为1位的格雷码按顺序书写加前缀0,后一半的码字为1位格雷码逆序书写加前缀1

格雷码 Gray

格雷码 Gray 格雷码定义: 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code) 格雷码的求解: 上一次求解到的Gray码, 按顺序给每一个都加上前缀0,  得到前一半,然后,将Gray码逆序,给每一个都加上前缀1就是答案. 例如: n = 1 Gray: 0 1 n = 2 00  01  (顺序 0 1) 11  10  (逆序 1 0) 具体代码 #include <bits/stdc++.h> using namespace std

gray-code (格雷码)

题目描述 The gray code(格雷码) is a binary numeral system where two successive values differ in only one bit. Given a non-negative integer n representing the total number of bits in the code, print the sequence of gray code. A gray code sequence must begin

LeetCode:Gray Code

1.题目名称 Gray Code(格雷码) 2.题目地址 https://leetcode.com/problems/gray-code/ 3.题目内容 英文: The gray code is a binary numeral system where two successive values differ in only one bit. Given a non-negative integer n representing the total number of bits in the