标签:
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
格雷码
二进制转格雷码的话
二进制码→格雷码(编码):
此方法从对应的n位二进制码字中直接得到n位格雷码码字,步骤如下:
对n位二进制的码字,从右到左,以0到n-1编号
如果二进制码字的第i位和i+1位相同,则对应的格雷码的第i位为0,否则为1(当i+1=n时,二进制码字的第n位被认为是0,即第n-1位不变)[3]
公式表示: (G:格雷码,B:二进制码)
,直接dp就行
#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])
#define Lson (x<<1)
#define Rson ((x<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (100000007)
#define MAXN (200000+10)
#define MAXai (1000)
typedef long long ll;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
char s[MAXN];
int f[MAXN][2];
int p[MAXN];
int a[MAXN];
int main()
{
// freopen("G.in","r",stdin);
int T; cin>>T;
For(kcase,T) {
MEMi(f) MEM(a) MEM(p)
scanf("%s",s);
int n=strlen(s);
Rep(i,n) p[i]=s[n-1-i]=='?' ? -1 : s[n-1-i]-'0';
p[n]=0;
RepD(i,n-1) scanf("%d",&a[i]);
if (p[0]==-1) f[0][0]=0,f[0][1]=0;
if (p[0]==0) f[0][0]=0;
if (p[0]==1) f[0][1]=0;
For(i,n) Rep(j,2) {
if (p[i]!=-1&&p[i]!=j) continue;
f[i][j]=max(f[i-1][j],f[i][j]);
f[i][j]=max(f[i][j],f[i-1][j^1]+a[i-1]);
}
// For(i,n) {
// Rep(j,2) cout<<f[i][j]<<' ';cout<<endl;
// }
printf("Case #%d: %d\n",kcase,f[n][0]);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/nike0good/article/details/48009703