题目连接 : 传送门

题意:

给定一个长度为的二进制串和一个长度为n的序列a[],我们能够依据这个二进制串得到它的Gray code。

Gray code中假设第i项为1的话那么我们就能够得到a[i]的值,在原来的二进制串中有一些位置为?

表示能够为0,

也能够为1求最后所能得到的最大的值。

已知二进制码怎样得到Gray code请看:传送门

分析:

我们能够通过动态规划来解决问题,状态转移也很好找 ,dp[i][j]表示到第i个位置。第i个位置

取j所能得到的最大值。非常明显这个题的j仅仅能有两种取值0,1.

详细的状态转移看代码。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std; const int maxn = 2e5+10; typedef long long LL; char str[maxn]; LL dp[maxn][2]; int a[maxn]; int main()
{
int n,t,cas=1;
scanf("%d",&t);
while(t--){
scanf("%s",str);
n=strlen(str);
for(int i=0;i<n;i++) scanf("%d",a+i);
memset(dp,0,sizeof(dp));
if(str[0]=='1'||str[0]=='? ') dp[0][1]= a[0];
for(int i=1;i<n;i++){
if(str[i]=='? '){
if(str[i-1]=='0')dp[i][1] = dp[i-1][0]+a[i],dp[i][0]=dp[i-1][0];
if(str[i-1]=='1') dp[i][0] = dp[i-1][1]+a[i],dp[i][1]=dp[i-1][1];
if(str[i-1]=='?'){
dp[i][0] = max(dp[i-1][0],dp[i-1][1]+a[i]);
dp[i][1] = max(dp[i-1][1],dp[i-1][0]+a[i]);
}
}
else{
if(str[i]=='1'&&str[i-1]=='?') dp[i][1] = max(dp[i-1][0]+a[i],dp[i-1][1]);
if(str[i]=='1'&&str[i-1]=='1') dp[i][1] =dp[i-1][1];
if(str[i]=='1'&&str[i-1]=='0') dp[i][1] =dp[i-1][0]+a[i];
if(str[i]=='0'&&str[i-1]=='1') dp[i][0] = dp[i-1][1]+a[i];
if(str[i]=='0'&&str[i-1]=='?') dp[i][0] = max(dp[i-1][1]+a[i],dp[i-1][0]);
if(str[i]=='0'&&str[i-1]=='0') dp[i][0] =dp[i-1][0];
}
}
printf("Case #%d: ",cas++);
if(str[n-1]=='?') printf("%I64d\n",max(dp[n-1][0],dp[n-1][1]));
if(str[n-1]=='0') printf("%I64d\n",dp[n-1][0]);
if(str[n-1]=='1') printf("%I64d\n",dp[n-1][1]);
}
return 0;
}

最新文章

  1. strncpy函数使用
  2. mysql的优化
  3. EasyUI 的Tab 标签添加右键菜单
  4. Activity 生命周期
  5. NOIP2015 运输计划(bzoj4326)
  6. BootLoader 详解(2)
  7. 关于1Byte 1K 1M 1G(换算)
  8. Redis启动警告错误解决
  9. 洛谷P2085 最小函数值(minval)
  10. c++复习基础要点02 虚函数与模板 与static inline是否共存
  11. Clear all username or password for login.
  12. Android Studio Gradle 添加.so 支持文件
  13. 读《不要告诉我你懂margin(海玉的博客)》有感
  14. ViewCompat.animate(view) floatEval.evaluate() argbEval.evaluate()
  15. struts2.1.6教程十二、总结
  16. Apache Camel之FTP组件学习
  17. Nginx系列一:正向代理和反向代理、Nginx工作原理、Nginx常用命令和升级、搭建Nginx负载均衡
  18. python数据结构与算法第三天【时间复杂度计算方法】
  19. 【Luogu2664】树上游戏(点分治)
  20. 怎样从外网访问内网OpenLDAP数据库

热门文章

  1. Android应用之——自己定义控件ToggleButton
  2. VS头部自动注释
  3. Oprofile分析(android oprofile性能分析)
  4. 移动web中的流式布局和viewport知识介绍
  5. &lt;错误&gt;
  6. surfaceView实现拍照功能
  7. Aspx小记
  8. JS 数值转换、加减乘除
  9. 路飞学城Python-Day30
  10. 实验楼—Mysql—查找最爱学的课程