标签:
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