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
代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define INF 1000000000 using namespace std; char s[200005]; int a[200005],dp[200005][2]; int max(int a,int b) { return a>b?a:b; } int main() { int t,len,i,cnt=1; scanf("%d",&t); getchar(); while(t--) { scanf("%s",s+1); len=strlen(s+1); for(i=1;i<=len;i++) { scanf("%d",&a[i]); getchar(); } memset(dp,0,sizeof(dp)); if(s[1]=='0') dp[1][0]=0; else if(s[1]=='1') dp[1][1]=a[1]; else { dp[1][1]=a[1]; dp[1][0]=0; } for(i=2;i<=len;i++) { if(s[i]=='0') { if(s[i-1]=='0') dp[i][0]=dp[i-1][0]; else if(s[i-1]=='1') dp[i][0]=dp[i-1][1]+a[i]; else dp[i][0]=max(dp[i-1][0],dp[i-1][1]+a[i]); } else if(s[i]=='1') { if(s[i-1]=='0') dp[i][1]=dp[i-1][0]+a[i]; else if(s[i-1]=='1') dp[i][1]=dp[i-1][1]; else dp[i][1]=max(dp[i-1][0]+a[i],dp[i-1][1]); } else { if(s[i-1]=='0') { dp[i][1]=dp[i-1][0]+a[i]; dp[i][0]=dp[i-1][0]; } else if(s[i-1]=='1') { dp[i][1]=dp[i-1][1]; dp[i][0]=dp[i-1][1]+a[i]; } else { dp[i][1]=max(dp[i-1][0]+a[i],dp[i-1][1]); dp[i][0]=max(dp[i-1][0],dp[i-1][1]+a[i]); } } } printf("Case #%d: ",cnt++); printf("%d\n",max(dp[len][0],dp[len][1])); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/david_jett/article/details/47606187