Gray code
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 185 Accepted Submission(s): 105

Now , you are given a binary number of length n including ‘0’ , ’1’ and ‘?’(? means that you can use either 0 or 1 to fill this position) and n integers(a1,a2,….,an) . A certain binary number corresponds to a gray code only. If the ith bit of this gray code is 1,you can get the point ai.
Can you tell me how many points you can get at most?
For instance, the binary number “00?0” may be “0000” or “0010”,and the corresponding gray code are “0000” or “0011”.You can choose “0000” getting nothing or “0011” getting the point a3 and a4.
Each test case begins with string with ‘0’,’1’ and ‘?’.
The next line contains n (1<=n<=200000) integers (n is the length of the string).
a1 a2 a3 … an (1<=ai<=1000)
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
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1)
#define bug printf("hihi\n")
#define eps 1e-8
typedef long long ll;
using namespace std;
#define mod 1000000007
#define INF 0x3f3f3f3f
#define N 200005
int va[N];
char c[N];
int len;
int ans;
int dp[N][2];
int ca=0;
void DP()
{
int i,j;
if(c[1]=='1')
{
dp[1][1]=va[1];
dp[1][0]=-INF;
}
else
if(c[1]=='0')
{
dp[1][1]=-INF;
dp[1][0]=0;
}
else
{
dp[1][0]=0;
dp[1][1]=va[1];
}
for(i=2;i<=len;i++)
if(c[i]=='1')
{
dp[i][1]=max(dp[i-1][1],dp[i-1][0]+va[i]);
dp[i][0]=-INF;
}
else if(c[i]=='0')
{
dp[i][1]=-INF;
dp[i][0]=max(dp[i-1][0],dp[i-1][1]+va[i]);
}
else
{
dp[i][1]=max(dp[i-1][1],dp[i-1][0]+va[i]);
dp[i][0]=max(dp[i-1][1]+va[i],dp[i-1][0]);
}
printf("Case #%d: %d\n",++ca,max(dp[len][0],dp[len][1]));
}
int main()
{
int i,j,t,ca=0;
scanf("%d",&t);
while(t--)
{
scanf("%s",c+1);
len=strlen(c+1);
for(i=1;i<=len;i++)
scanf("%d",&va[i]);
DP();
}
return 0;
}
7695



被折叠的 条评论
为什么被折叠?



