hdu 5375 Gray code(DP)
2015-08-11 21:29
323 查看
hdu 5375 Gray code
Problem DescriptionThe reflected binary code, also known as Gray code after Frank Gray, is a binary numeral system where two successive values differ in only onebit (binary digit). The reflected binary code was originally designed to prevent spurious output from electromechanical switches. Today, Gray codes are widely used to facilitate error correction in digital communications such as digital terrestrial television and some cable TV systems.
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.
Input
The first line of the input contains the number of test cases T.
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)
Output
For each test case, output “Case #x: ans”, in which x is the case number counted from one,’ans’ is the points you can get at most
Sample Input
2
00?0
1 2 4 8
????
1 2 4 8
Sample Output
Case #1: 12
Case #2: 15
Hint
https://en.wikipedia.org/wiki/Gray_code
http://baike.baidu.com/view/358724.htm
题目大意:给出一个包含‘1’,‘0’,‘?’的二进制数,‘?’可以是‘0’或‘1’。将该二进制数转化为格雷码。并将num数组中该位格雷码为‘1’的数相加,求该和的最大值。
解题思路:DP。
[code]#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <cstdlib> using namespace std; const int N = 200005; const int INF = 0x3f3f3f3f; typedef long long ll; char s ; int dp [2], num ; int main() { int T, Case = 1; scanf("%d", &T); while (T--) { getchar(); printf("Case #%d: ", Case++); gets(s); int len = strlen(s); for (int i = 0; i < len; i++) { scanf("%d", &num[i]); } if (s[0] == '1') { dp[0][1] = num[0]; dp[0][0] = -INF; } else if (s[0] == '0') { dp[0][1] = -INF; dp[0][0] = 0; } else { dp[0][1] = num[0]; dp[0][0] = 0; } for (int i = 1; i < len; i++) { if (s[i] == '0') { dp[i][0] = max(dp[i - 1][1] + num[i], dp[i - 1][0]); dp[i][1] = -INF; } else if (s[i] == '1') { dp[i][1] = max(dp[i - 1][0] + num[i], dp[i - 1][1]); dp[i][0] = -INF; } else { dp[i][1] = max(dp[i - 1][0] + num[i], dp[i - 1][1]); dp[i][0] = max(dp[i - 1][1] + num[i], dp[i - 1][0]); } } printf("%d\n", max(dp[len - 1][1], dp[len - 1][0])); } return 0; }
相关文章推荐
- POJ2429 GCD & LCM Inverse
- 借贷宝有多少人看得懂?借贷宝系统崩溃分析
- K - Leapin' Lizards - HDU 2732(最大流)
- 最大公共字串LCS问题(阿里巴巴)
- java实现邮箱发送功能
- 用RAID0 安装Ubuntu Server
- java复习-类和对象(二)
- 欢迎使用CSDN-markdown编辑器
- NOIP2013 货车运输(最大生成树+LCA)
- 链表插入排序
- HDU1272 小希的迷宫
- SQL遍历文件夹 / 文件,返回文件夹列表信息
- Scala 深入浅出实战经典 第54讲:Scala中复合类型实战详解
- Java读写txt文件中文乱码问题的解决
- C语言第二天
- HDOJ 1002 A + B Problem II (Big Numbers Addition)
- 还在为工作发愁?学JavaScript吧
- 我所理解的service
- android:installLocation="preferExternal"的意义
- atitit.js的 字符串内容 转义  js处理html