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] ...
随机推荐
- POJ 2127
#include <iostream> #define MAXN 501 using namespace std; int a[MAXN],b[MAXN],ans[MAXN]; int G ...
- BroadcastReceiver应用1
有两种注册方式:1. 在AndroidManifest中注册.2. 在代码中直接注册,这种注册需要注意的一点是:当注册此Receiver的Activity退出的时候,一定要调用unregisterRe ...
- Spark源码编译
原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3822995.html spark源码编译步骤如下: cd /home/hdpusr/workspace ...
- PowerMockito(PowerMock用法)
网络上大部分是powermock 的用法, PowerMock有两个重要的注解: –@RunWith(PowerMockRunner.class) –@PrepareForTest( { YourCl ...
- UNIX网络编程——网络IPC:套接字
UNIX网络编程——网络IPC:套接字 Contents 套接字接口 套接字描述符 寻址 字节序 地址格式 地址查询 绑定地址 建立连接 数据传输 套接字选项 带外数据 UNIX域套接字 使用套接字的 ...
- Android UI 之 Tab类型界面总结
Android 程序中实现Tab类型界面很常见,本人在做项目的时候也经常用到,所以想在这里总结一下,实现tab类型界面的几种方式,供大家参考.如有不对之处,欢迎大家指正! 一.TabActivity ...
- highCharts图表入门实例
本文通过讲解Highcharts生成一个简单的3D柱状图实例来学习Highcharts的使用. JSP 页面 1.需要引入的js文件 <script src="<%=basePa ...
- Java 数据结构之ArrayList
ArrayList:数组队列,就是动态数组,可以动态的增加和减少元素.实现了ICollection和IList接口.灵活的设置数组的大小 具体的用法: 1.创建:ArrayList list = ne ...
- java eclise的配置
java eclise的配置 http://jingyan.baidu.com/album/870c6fc33e62bcb03fe4be90.html?picindex=24
- PHP dirname() 返回路径中的目录部分basename() 函数返回路径中的文件名部分。
dirname (PHP 4, PHP 5) dirname — 返回路径中的目录部分说明string dirname ( string $path ) 给出一个包含有指向一个文件的全路径的字符串,本 ...