
2 00?0 1 2 4 8 ???? 1 2 4 8
Case #1: 12 Case #2: 15Hinthttps://en.wikipedia.org/wiki/Gray_code http://baike.baidu.com/view/358724.htm
题意:给你一串二进制代码,?既可以表示1也可以表示0。将其转换成格雷码,每一位都有对应的数值,问将所有格雷码为1的数值相加,求最大值。
题解:首先我们要知道二进制码怎么转换为格雷码。将所需转换的数右移一位再与原数异或即可。这里我们可以发现当前位置的取值至于下一位有关,所以我们想可以用dp解决此问题。
参考代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define max(a,b) a>b?a:b
using namespace std;
const int N = 200005;
const int INF = 999999999;
char s[N];
int dp[N][2], num[N];
int main() {
int T, Case = 1;
scanf("%d", &T);
while (T--) {
getchar();
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("Case #%d: ", Case++);
printf("%d\n", max(dp[len - 1][1], dp[len - 1][0]));
}
return 0;
}版权声明:本文为博主原创文章,随便转载。
原文:http://blog.csdn.net/luwhere/article/details/47663437