HDU 5375——Gray code——————【dp||讨论】
Gray code
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 569 Accepted Submission(s): 337
Now , you are given a binary number of length n including ‘0’ , ’1’ and ‘?’(? means that you can use either 0 or 1 to fill this position) and n integers(a1,a2,….,an) . A certain binary number corresponds to a gray code only. If the ith bit of this gray code is 1,you can get the point ai.
Can you tell me how many points you can get at most?
For instance, the binary number “00?0” may be “0000” or “0010”,and the corresponding gray code are “0000” or “0011”.You can choose “0000” getting nothing or “0011” getting the point a3 and a4.
Each test case begins with string with ‘0’,’1’ and ‘?’.
The next line contains n (1<=n<=200000) integers (n is the length of the string).
a1 a2 a3 … an (1<=ai<=1000)
https://en.wikipedia.org/wiki/Gray_code
#include<bits/stdc++.h>
using namespace std;
#define max(a,b) ((a)>(b)?(a):(b))
const int maxn=1e5+200;
const int INF=0x3f3f3f3f;
int dp[2*maxn][2];
int a[2*maxn];
char str[2*maxn];
int main(){
int t,cnt=0;
scanf("%d",&t);
while(t--){
scanf("%s",str+1);
int len=strlen(str+1);
for(int i=1;i<=len;i++){
scanf("%d",&a[i]);
dp[i][1]=dp[i][0]=-INF;
}
if(str[1]=='0'){
dp[1][0]=0;
}else if(str[1]=='1'){
dp[1][1]=a[1];
}else{
dp[1][0]=0;
dp[1][1]=a[1];
}
for(int i=2;i<=len;i++){
if(str[i]=='0'){
dp[i][0]=max(dp[i-1][0],dp[i-1][1]+a[i]);
}else if(str[i]=='1'){
dp[i][1]=max(dp[i-1][0]+a[i],dp[i-1][1]);
}else {
dp[i][1]=max(dp[i-1][0]+a[i],dp[i-1][1]);
dp[i][0]=max(dp[i-1][1]+a[i],dp[i-1][0]);
}
}
printf("Case #%d: %d\n",++cnt,max(dp[len][1],dp[len][0]));
}
return 0;
}
讨论:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=1e6+200;
const int INF=0x3f3f3f3f;
char str[2*maxn];
int a[maxn*2];
int main(){
int t,cnt=0;
scanf("%d",&t);
while(t--){
scanf("%s",str);
int len=strlen(str);
for(int i=0;i<len;i++)
scanf("%d",&a[i]);
int sum=0,pos=len,flag=-1;
int i;
for(i=len-1;i>=0;i--){ //逆序处理
if(str[i]=='0'){
if(flag==1){ //如果右边有1
sum+=a[pos];
}
flag=0; //表示当前是0
pos=i;
continue;
}else if(str[i]=='1'){
if(flag==0){
sum+=a[pos];
}
flag=1;
pos=i;
continue;
}else{ //是问号
int num=0,sumv,minv;
if(flag!=-1){
minv=a[pos],sumv=a[pos];
}
else {
minv=INF,sumv=0;
}
int j;
for(j=i;j>=0;j--){
if(str[j]=='0'){
if(flag==1){
if(num%2==1){ //如果问号两边不同,且中间的问号为奇数个,舍弃这段中的最小值
sum+=(sumv-minv);
}else {
sum+=sumv;
}
}else if(flag==0){
if(num%2==1){ //如果两边相同,且中间为奇数个,加上这段所有值
sum+=sumv;
}else{
sum+=(sumv-minv);
} }else{
sum+=sumv;
}
flag=-1;
pos=len;
i=j+1;
break;
}else if(str[j]=='1'){
if(flag==0){
if(num%2==1){
sum+=(sumv-minv);
}else{
sum+=sumv;
}
}else if(flag==1){
if(num%2==0){
sum+=(sumv-minv);
}else{
sum+=sumv;
}
}else{
sum+=sumv;
}
flag=-1;
pos=len;
i=j+1;
break;
}else {
num++;
sumv+=a[j];
if(minv>a[j]){
minv=a[j];
}
}
}
if(j==-1){ //边界处理,比较恶心
i=0;
if(flag==-1 )
sum+=sumv;
else if (flag==1){
if(num%2==0){
sum+= sumv;
}
else sum+=(sumv-minv);
}else {
if(num%2==1){
sum+=sumv;
}else{
sum+=(sumv-minv);
}
}
}
}
}
if(str[0]=='1'&&i==-1){ //字串第一位
sum+=a[0];
}
printf("Case #%d: %d\n",++cnt,sum);
}
return 0;
}
HDU 5375——Gray code——————【dp||讨论】的更多相关文章
- hdu 5375 Gray code dp
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; cons ...
- 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 ...
- 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 ...
- HDU 5375 Gray code(2015年多校联合 动态规划)
题目连接 : 传送门 题意: 给定一个长度为的二进制串和一个长度为n的序列a[],我们能够依据这个二进制串得到它的Gray code. Gray code中假设第i项为1的话那么我们就能够得到a[i] ...
- hdu 5375 Gray code 【 dp 】
dp[i][j]表示第i位取j的时候取得的最大的分数 然后分s[i]是不是问号,s[i-1]是不是问号这大的四种情况讨论 #include<cstdio> #include<cstr ...
- HDU 5375 Gray code(DP)
题意:给一串字符串,里面可能出现0,1,?,当中问号可能为0或1,将这个二进制转换为格雷码后,格雷码的每位有一个权值,当格雷码位取1时.加上该位权值,求最大权值和为多少. 分析:比赛的时候愚了.竟然以 ...
- HDU 5375 Gray code 格雷码(水题)
题意:给一个二进制数(包含3种符号:'0' '1' '?' ,问号可随意 ),要求将其转成格雷码,给一个序列a,若转成的格雷码第i位为1,则得分+a[i].求填充问号使得得分最多. 思路:如果了 ...
- HDU 5375 Gray code
题意:给出一个二进制数,其中有些位的数字不确定,对于所有对应的格雷码,与一个序列a对应,第i位数字为1时得分a[i],求最大的得分. 解法:一个二进制数x对应的格雷码为x ^ (x >> ...
随机推荐
- Data Base 常用数据库参数的前缀表示符合
可能参数化SQL语句不同,例如在Access中参数化SQL语句是在参数直接以“?”作为参数名,在SQL Server中是参数有“@”前缀,在MySQL中是参数有“?”前缀,在Oracle中参数以“:” ...
- [Spring Boot]Request method 'GET' not supported
在网上查了些资料没有解决,检查代码发现 @PostMapping public String add(Employee employee){ System.out.println(employee); ...
- AtCoder Grand Contest 011D(思维,规律,异或)
#include<bits/stdc++.h>using namespace std;char s[200007];int ans[200007];int main(){ int n ...
- server2008 IIS7配置全过程(包括发布ASP网站)
一.安装IIS 1.打开服务器管理器->角色->添加角色,选中WEB服务器(IIS),记得要把包括之后出现的ASP相关的东西都选中并安装,安装成功后,打开http://localhost/ ...
- 青橙 A1280. 最长双回文串
A1280. 最长双回文串 时间限制:2.0s 内存限制:512.0MB 总提交次数: AC次数: 平均分: 将本题分享到: 查看未格式化的试题 提交 试题讨 ...
- uoj#448. 【集训队作业2018】人类的本质(Min_25筛+拉格朗日插值)
题面 传送门 题解 肝了整整一天--膜拜yww和cx巨巨--(虽然它们的题解里我就没看懂几个字) 请备好草稿纸和笔,这种题目就是需要耐心推倒 题目所求是这么一个东西 \[ \begin{aligned ...
- 关于Intel芯片架构的发展史
---恢复内容开始--- 当你真正的深入去行走在底层的道路上,你就会接触大量的一些貌似懂的概念性名词,比如Intel公司的x86架构,x64等等,又或者是当年的386,486等等,唉,有的时候真的是 ...
- php http 缓存(客户端缓存)
<?php /* * Expires:过期时间 * Cache-Control: 响应头信息 * (max-age:[秒]缓存过期时间(请求时间开始到过期时间的秒数), * s-maxage:[ ...
- SprimgMVC学习笔记(五)—— Controller方法返回值
一.返回ModelAndView controller方法中定义ModelAndView对象并返回,对象中可添加model数据.指定view. /** * 查询商品列表 * @return */ @R ...
- ssh免密登录linux服务器
Ssh免密登录 sshd服务 sshd简介: SSH 密钥为登录 Linux 服务器提供了更好且安全的机制.运行 ssh-keygen 后,将会生成公私密钥对.你可以将公钥放置到任意服务器,从持有私钥 ...