标准格雷码的性质:二进制a1 a2 ... an,对应的格雷码为a1 (a1 xor a2) ... (an-1 xor an) 题目就可以转为O(n)的dp dp[i][j]表示二进制第i位为j时前i位对应最大分数.
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
/* *********************************************** Author :CKboss Created Time :2015年08月11日 星期二 20时56分37秒 File Name :HDOJ5375.cpp ************************************************ */ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <cmath> #include <cstdlib> using namespace std; const int maxn=200200; int n; char str[maxn]; int a[maxn]; int dp[maxn][2]; int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int cas=1,T_T; scanf("%d",&T_T); while(T_T--) { scanf("%s",str); n=strlen(str); for(int i=0;i<n;i++) { scanf("%d",a+i); dp[i][0]=dp[i][1]=0; } if(str[0]=='1'||str[0]=='?') dp[0][1]=a[0]; for(int i=1;i<n;i++) { if(str[i]=='0') { if(str[i-1]=='?'||str[i-1]=='1') dp[i][0]=max(dp[i][0],dp[i-1][1]+a[i]); if(str[i-1]=='?'||str[i-1]=='0') dp[i][0]=max(dp[i][0],dp[i-1][0]); } else if(str[i]=='1') { if(str[i-1]=='?'||str[i-1]=='0') dp[i][1]=max(dp[i][1],dp[i-1][0]+a[i]); if(str[i-1]=='?'||str[i-1]=='1') dp[i][1]=max(dp[i][1],dp[i-1][1]); } else if(str[i]=='?') { /// ? --> 0 if(str[i-1]=='?'||str[i-1]=='1') dp[i][0]=max(dp[i][0],dp[i-1][1]+a[i]); if(str[i-1]=='?'||str[i-1]=='0') dp[i][0]=max(dp[i][0],dp[i-1][0]); /// ? --> 1 if(str[i-1]=='?'||str[i-1]=='0') dp[i][1]=max(dp[i][1],dp[i-1][0]+a[i]); if(str[i-1]=='?'||str[i-1]=='1') dp[i][1]=max(dp[i][1],dp[i-1][1]); } } int ans=max(dp[n-1][0],dp[n-1][1]); printf("Case #%d: %d\n",cas++,ans); } return 0; }