HDU 5375 Gray code(DP)
题意:给一串字符串,里面可能出现0,1,?,当中问号可能为0或1,将这个二进制转换为格雷码后,格雷码的每位有一个权值,当格雷码位取1时。加上该位权值,求最大权值和为多少。
分析:比赛的时候愚了。竟然以为格雷码是由3个二进制字符转换的,于是妥妥wa了,事实上格雷码的求法是通过异或求的的,即Gi=Bi⊕Bi-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)的更多相关文章
- hdu 5375 - Gray code(dp) 解题报告
Gray code Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- HDU 5375 Gray code (简单dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5375 题面: Gray code Time Limit: 2000/1000 MS (Java/Oth ...
- HDU 5375——Gray code——————【dp||讨论】
Gray code Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- hdu5375 Gray code(DP)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5375 题目大意:给你一个二进制串,带'?'的位置能够由你来决定填'1'还是'0',补充完整之后转换成 ...
- hdu 5375 Gray code 【 dp 】
dp[i][j]表示第i位取j的时候取得的最大的分数 然后分s[i]是不是问号,s[i-1]是不是问号这大的四种情况讨论 #include<cstdio> #include<cstr ...
- HDU 5375 Gray code 格雷码(水题)
题意:给一个二进制数(包含3种符号:'0' '1' '?' ,问号可随意 ),要求将其转成格雷码,给一个序列a,若转成的格雷码第i位为1,则得分+a[i].求填充问号使得得分最多. 思路:如果了 ...
- HDU 5791:Two(DP)
http://acm.hdu.edu.cn/showproblem.php?pid=5791 Two Problem Description Alice gets two sequences A ...
- HDU 4833 Best Financing(DP)(2014年百度之星程序设计大赛 - 初赛(第二轮))
Problem Description 小A想通过合理投资银行理财产品达到收益最大化.已知小A在未来一段时间中的收入情况,描述为两个长度为n的整数数组dates和earnings,表示在第dates[ ...
- 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 ...
随机推荐
- CG 内置函数 和 HLSL 内置函数
CG 内置函数 英伟达官网链接: http://http.developer.nvidia.com/Cg/index_stdlib.html absacosallanyasinatan2atanbi ...
- hdoj--1408--盐水的故事(技巧)
盐水的故事 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- TabLayout禁止选择
项目中有个页面上面是TabLayout下面是Listview,选择TabLayout的选项卡更新下面Listview里面的数据,在请求的时候想禁用TabLayout选项卡来避免用户频繁点击选项卡造成L ...
- Android PullToRefreshListView和ViewPager的结合使用
其实这个不是什么新东西了,在介绍(一)中我们就知道了PullToRefreshListView的用法,这里只要将其放入到ViewPager中就行啦.ViewPager还是和以往一样的定义和使用,在适配 ...
- 《剑指offer》跳台阶
一.题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 二.输入描述 输入n级台阶 三.输出描述 输出总有多少种不同跳法 四.牛客网提供的框架 cla ...
- 《剑指offer》旋转数组的最小数字
一.题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 二.输入描述 输入一个递增排序的数组的一个旋转 三.输出描述 输出旋转数组的最小元素 例如: 例如数组{3,4,5,1 ...
- vue.js技巧小计
//删除数组索引方法01 del (index) { this.arr.splice(index ,1); } //删除数组索引方法01 del (index) { this.$delete(this ...
- c# 静态成员和实例成员的区别
静态成员也称为共享成员,例如静态属性 静态字段 静态方法:静态成员可以在类的实例之间共享. 静态类中只能有静态成员,不能有实例成员,因为静态类不能进行实例化: 在非静态类中 即可以有静态成员 也可以有 ...
- 1、Go base64编码
package main import ( "encoding/base64" "fmt") func main() { //标准base64编码 data:= ...
- 链表python
无序链表.有序链表 有序列表排序通常是升序或降序,并且我们假设列表项具有已经定义的有意义的比较运算. 许多有序列表操作与无序列表的操作相同. 必须明确链表的第一项位置,一旦知道第一项. 链表实现的基本 ...