HDU 5375 Gray code 格雷码(水题)
题意:给一个二进制数(包含3种符号:'0' '1' '?' ,问号可随意 ),要求将其转成格雷码,给一个序列a,若转成的格雷码第i位为1,则得分+a[i]。求填充问号使得得分最多。
思路:如果了解格雷码的转换,相信能很快看出一些端倪。偷别人的图:

分析一下:所给的二进制数要转成格雷码,只与所给二进制有关。即不需要利用已经某些转换好的格雷码字。
接下来分析5个位的串 :
(1)00?00 仅有1个问号,只会与后面那些连续且非问号的串转成格雷码有关
(2)00??0 有连续的1个问号,这才需要用到dp啊,因为所有问号有很多组合可能,但是他们满足:第i位只与前1位有关。所以仅需记录此位为0的结果,和为1的结果。
(3)0?0?0 //问号不连续,按第1种处理。
没有问号的串没有什么DP可言,直接转。
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N=; char str[N];
int a[N];
int dp[N][]; //结果只有两种,第i位为0/1 int get_sum(int pos, int cur)//选个大的前缀,但并不需要关心其究竟是多少
{
int ans1=dp[pos-][]+ (^cur)*a[pos]; //选0试试
int ans2=dp[pos-][]+ (^cur)*a[pos]; //选1试试
return max(ans1, ans2);
} int cal(int n)
{
memset(dp, , sizeof(dp));
if(str[]=='' || str[]=='?') dp[][]= a[];
for(int i=; i<n; i++)
{
int t=str[i]-''; //当前
int p=str[i-]-''; //前一位
if( str[i]=='?' && str[i-]=='?' )
{
dp[i][]=get_sum(i, ) ;
dp[i][]=get_sum(i, ) ;
}
if( str[i]=='?' && str[i-]!='?' )
{
dp[i][]= dp[i-][p] +( p^) *a[i]; //前面是固定的,没啥好选。
dp[i][]= dp[i-][p] +( p^) *a[i];
}
if( str[i]=='' || str[i]=='')
{
if(str[i-]=='?') //前面是问号,取大者即可。
dp[i][t]=max( dp[i-][]+ (^t)*a[i], dp[i-][]+ (^t)*a[i] );
else
dp[i][t]= dp[i-][p]+ (p^t)*a[i];
}
}
return max(dp[n-][], dp[n-][]);
} int main()
{
freopen("input.txt", "r", stdin);
int t, tmp, j=;
char c;
cin>>t;
while(t--)
{
scanf("%s", str);
int len=strlen(str);
for(int i=; i<len; i++) scanf("%d", &a[i]); printf("Case #%d: %d\n", ++j, cal(len) );
}
return ;
}
AC代码
HDU 5375 Gray code 格雷码(水题)的更多相关文章
- HDU 5375 Gray code (简单dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5375 题面: Gray code Time Limit: 2000/1000 MS (Java/Oth ...
- [LeetCode] Gray Code 格雷码
The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...
- gray code 格雷码 递归
格雷码 the n-1 bit code, with 0 prepended to each word, followd by the n-1 bit code in reverse order, w ...
- HDU 5375——Gray code——————【dp||讨论】
Gray code Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- hdu 5375 - Gray code(dp) 解题报告
Gray code Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- [LeetCode] 89. Gray Code 格雷码
The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...
- [LintCode] Gray Code 格雷码
The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...
- Gray Code - 格雷码
基本概念 格雷码是一种准权码,具有一种反射特性和循环特性的单步自补码,它的循环.单步特性消除了随机取数时出现重大误差的可能,它的反射.自补特性使得求反非常方便.格雷码属于可靠性编码,是一种错误最小化的 ...
- HDU 5375 Gray code(2015年多校联合 动态规划)
题目连接 : 传送门 题意: 给定一个长度为的二进制串和一个长度为n的序列a[],我们能够依据这个二进制串得到它的Gray code. Gray code中假设第i项为1的话那么我们就能够得到a[i] ...
随机推荐
- HDU4010 Query on The Trees(LCT)
人生的第一道动态树,为了弄懂它的大致原理,需要具备一些前置技能,如Splay树,树链剖分的一些概念.在这里写下一些看各种论文时候的心得,下面的代码是拷贝的CLJ的模板,别人写的模板比较可靠也方便自己学 ...
- POJ 2004 Mix and Build (预处理+dfs)
题意: 给N个字符串,要求出一个序列,在该序列中,后一个串,是由前一个串加一个字母后得来的(顺序可以改动). 问最多能组成多长的序列.思路:将给的字符串排序,再对所有的字符串按长度从小到大排序,若长度 ...
- iOS第三方支付-银联支付
#import <Foundation/Foundation.h> #import <UIKit/UIKit.h> #import "UPPayPluginDeleg ...
- GridControl Find/Clear 添加图标
public static void ControlFind(GridControl grid) { FindControl fControl = null; foreach (Control ite ...
- android 四大组件Broadcast Receiver
本文介绍Broadcast Receiver,包括几部分内容:Broadcast Receiver概述及实例.自定义Broadcast Receiver.Broadcast Receiver的实现细节 ...
- hdu 4745 Two Rabbits
思路:求最长回文子串的长度!代码如下: #include<iostream> #include<stdio.h> #include<algorithm> #incl ...
- pku 1182(种类并查集)
题目链接:http://poj.org/problem?id=1182 解题思路来自discuss:http://poj.org/showmessage?message_id=152847 #incl ...
- linux系统下挂载windows共享目录
在工作中有时我们需要在linux上挂载windows共享目录.首先我们需要学会在linux上查看windows共享了那些目录.查看操作需要安装samba-client. [root@ ~]# yum ...
- C#获取当前路径的方法
C#获取当前路径的方法如下: 1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName -获取模块的完整路径. 2. ...
- hadoop疑难杂症解析
1:Shuffle Error: Exceeded MAX_FAILED_UNIQUE_FETCHES; bailing-outAnswer:程序里面需要打开多个文件,进行分析,系统一般默认数量是10 ...