题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5375
题意就是:给你一串二进制码,里面可能含有‘?‘这个既可以表示0又可以表示1,
让我们把这个二进制串转成格雷码串,转换之后的串中如果第 i 位为 1 那么就加上对应给出的a[i],求最大加的结果ans;
例如:
00?0
1 2 4 8
二进制串可以是 0000或者0010
转化成格雷码之后是0000或者0011
0000价值总和为0;
0011的价值总和为a[3]+a[4]=12;
dp[i][j]表示二进制第i位为j时的最大价值。同时应该注意初始化。
#include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> #include<math.h> using namespace std; #define N 200020 #define INF 0xfffffff int a[N], dp[N][2]; char s[N]; int main() { int T, n, t=1; scanf("%d", &T); while(T--) { memset(s, 0, sizeof(s)); memset(a, 0, sizeof(a)); memset(dp, 0, sizeof(dp)); scanf("%s", s); n=strlen(s); for(int i=0; i<n; i++) { scanf("%d", &a[i]); dp[i][0] = dp[i][1] = -INF; } if(s[0]==‘0‘ || s[0]==‘?‘) dp[0][0] = 0; if(s[0]==‘1‘ || s[0]==‘?‘) dp[0][1] = a[0]; for(int i=1; i<n; i++) { if(s[i]==‘0‘ || s[i]==‘?‘) dp[i][0] = max(dp[i-1][0], dp[i-1][1]+a[i]); if(s[i]==‘1‘ || s[i]==‘?‘) dp[i][1] = max(dp[i-1][1], dp[i-1][0]+a[i]); } int ans=max(dp[n-1][0], dp[n-1][1]); printf("Case #%d: %d\n", t++, ans); } return 0; }
时间: 2024-10-05 10:04:23