题意:给一串字符串,里面可能出现0,1,?,当中问号可能为0或1,将这个二进制转换为格雷码后,格雷码的每位有一个权值,当格雷码位取1时。加上该位权值,求最大权值和为多少。



分析:比赛的时候愚了。竟然以为格雷码是由3个二进制字符转换的,于是妥妥wa了,事实上格雷码的求法是通过异或求的的,即Gi=BiBi-1(G为格雷码,B为二进制数),那么仅仅要水水的DP一下就好了。详细DP是通过保存

DP[i][j],当中i为当前位。j表示当前为为0还是1,递推式为:

一、s[i]为0时

1.s[i-1]为0,dp[i][0]=dp[i-1][0];

2.s[i-1]为1,dp[i][0]=dp[i-1][1]+v[i];

3.s[i-1]为?,dp[i][0]=max(dp[i-1][0],dp[i-1][1]+v[i]);

二、s[i]为1时

1.s[i-1]为0,dp[i][1]=dp[i-1][0]+v[i];

2.s[i-1]为1。dp[i][1]=dp[i-1][1];

3.s[i-1]为?,dp[i][1]=max(dp[i-1][0]+v[i],dp[i-1][1]);

三、s[i]为?时,就是结合上面两种情况

1.s[i-1]为0,dp[i][0]=dp[i-1][0],dp[i][1]=dp[i-1][0]+v[i];

2.s[i-1]为1,dp[i][0]=dp[i-1][1]+v[i],dp[i][1]=dp[i-1][1];

3.s[i-1]为?,dp[i][0]=max(dp[i-1][0],dp[i-1][1]+v[i]),dp[i][1]=max(dp[i-1][0]+v[i],dp[i-1][1]);



代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include<vector>
#pragma comment(linker,"/STACK:1024000000,1024000000")
using namespace std;
const int maxn = 2e5+5;
char s[maxn];
int v[maxn];
int dp[maxn][3];
int main()
{
int t;
scanf("%d",&t);
for(int cas=1;cas<=t;cas++){
memset(dp,0,sizeof(dp));
scanf("%s",s+1);
int n=strlen(s+1);
s[0]='0';
for(int i=1;i<=n;i++)
{
scanf("%d",&v[i]);
}
for(int i=1;i<=n;i++)
{
if(s[i]=='1') {
if(s[i-1]=='?')
dp[i][1]=max(dp[i-1][0]+v[i],dp[i-1][1]);
else if(s[i-1]=='0') dp[i][1]=dp[i-1][0]+v[i];
else dp[i][1]=dp[i-1][1];
}
if(s[i]=='0') {
if(s[i-1]=='?')
dp[i][0]=max(dp[i-1][0],dp[i-1][1]+v[i]);
else if(s[i-1]=='0') dp[i][0]=dp[i-1][0];
else dp[i][0]=dp[i-1][1]+v[i];
}
if(s[i]=='? '){
if(s[i-1]=='?'){
dp[i][1]=max(dp[i-1][0]+v[i],dp[i-1][1]);
dp[i][0]=max(dp[i-1][0],dp[i-1][1]+v[i]);
}
else if(s[i-1]=='0'){
dp[i][1]=dp[i-1][0]+v[i];
dp[i][0]=dp[i-1][0];
}
else{
dp[i][1]=dp[i-1][1];
dp[i][0]=dp[i-1][1]+v[i];
}
}
}
printf("Case #%d: %d\n",cas,max(dp[n][0],dp[n][1]));
}
}

HDU 5375 Gray code(DP)的更多相关文章

  1. hdu 5375 - Gray code(dp) 解题报告

    Gray code Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

  2. HDU 5375 Gray code (简单dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5375 题面: Gray code Time Limit: 2000/1000 MS (Java/Oth ...

  3. HDU 5375——Gray code——————【dp||讨论】

    Gray code Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  4. hdu5375 Gray code(DP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5375 题目大意:给你一个二进制串,带'?'的位置能够由你来决定填'1'还是'0',补充完整之后转换成 ...

  5. hdu 5375 Gray code 【 dp 】

    dp[i][j]表示第i位取j的时候取得的最大的分数 然后分s[i]是不是问号,s[i-1]是不是问号这大的四种情况讨论 #include<cstdio> #include<cstr ...

  6. HDU 5375 Gray code 格雷码(水题)

    题意:给一个二进制数(包含3种符号:'0'  '1'  '?'  ,问号可随意 ),要求将其转成格雷码,给一个序列a,若转成的格雷码第i位为1,则得分+a[i].求填充问号使得得分最多. 思路:如果了 ...

  7. HDU 5791:Two(DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=5791 Two Problem Description   Alice gets two sequences A ...

  8. HDU 4833 Best Financing(DP)(2014年百度之星程序设计大赛 - 初赛(第二轮))

    Problem Description 小A想通过合理投资银行理财产品达到收益最大化.已知小A在未来一段时间中的收入情况,描述为两个长度为n的整数数组dates和earnings,表示在第dates[ ...

  9. 2015 Multi-University Training Contest 7 hdu 5375 Gray code

    Gray code Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

随机推荐

  1. jquery开发之代码风格

    1,链式操作风格. (1) 对于同一个对象不超过三个操作的.可直接写成一行.代码例如以下: $("li").show().unbind("click"); (2 ...

  2. Random words

    To choose a random word from the histogram, the simplest algorithm is to build a list with multiple ...

  3. 继承—Monkey

    public class Monkey { public void Monkey(String s){ } public void speak(){ System.out.println(" ...

  4. mac、windows如何强制关闭tomcat进程

    方式1.打开cmd,或mac的终端,输入: ① ps aux | grep "tomcat",找到响应的进程id: ② kill -9 查询的id,来强制关闭进程 方式2:wind ...

  5. Decorator - 利用装饰器武装前端代码

    历史 以前做后端时,接触过一点Spring,也是第一次了解DI.IOC等概念,面向切面编程,对于面向对象编程还不怎么熟练的情况下,整个人慌的一批,它的日志记录.数据库配置等都非常方便,不回侵入到业务代 ...

  6. ln---创建链接

    ln命令用来为文件创件连接,连接类型分为硬连接和符号连接两种,默认的连接类型是硬连接.如果要创建符号连接必须使用"-s"选项. 注意:符号链接文件不是一个独立的文件,它的许多属性依 ...

  7. Eclipse反编译插件 Enhanced Class Decompiler

    因为jar包中的源码都是经过反编译的,所以需要安装插件才能查看到源码,此处介绍的是 Enhanced Class Decompiler 插件. 打开Eclipse,Help --> Eclips ...

  8. Spring Cloud学习笔记【四】断路器Hystrix

    雪崩效应 在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应.服务雪崩效应是一种因 “服务提供者” 的不可用导致 “服务消 ...

  9. PatentTips - Managing sequenced lock requests

    BACKGROUND In a multi-threaded processing environment, two or more threads may require access to a c ...

  10. 浅谈Python Web的五大框架

    说到Web Framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界.各种micro-framework.framework不可胜数. 尽管还有一大脚本语言PHP也有 ...