CF-517B-DP
http://codeforces.com/contest/1072/problem/B
给出两个数列 a,b 长度为n-1 ,询问是否能构造出一个长度为n的数列t,使得 所有的ab都满足 a[i]=t[i]|t[i+1] b[i]=t[i]&t[i+1] ,其中所有数列的值都满足 [0,3]之内。
由于数值只有四种,直接dp,f[i][j]表示t[i]=j是否可行,记录下路径就好了。
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 #define LL long long 6 const int maxn=100000+15; 7 int n,a[maxn],b[maxn]; 8 bool f[maxn][4]; 9 int pre[maxn][4]; 10 void out(int n,int i){ 11 if(n==0) return; 12 out(n-1,pre[n][i]); 13 cout<<i<<' '; 14 } 15 int main(){ 16 cin>>n; 17 for(int i=1;i<n;++i) cin>>a[i]; 18 for(int i=1;i<n;++i) cin>>b[i]; 19 memset(pre,-1,sizeof(pre)); 20 f[1][0]=f[1][1]=f[1][2]=f[1][3]=1; 21 for(int i=1;i<=n;++i){ 22 for(int j=0;j<4;++j){ 23 if(f[i][j]){ 24 for(int k=0;k<4;++k){ 25 if((j|k)==a[i] && (j&k)==b[i]){ 26 f[i+1][k]=1; 27 pre[i+1][k]=j; 28 } 29 } 30 } 31 } 32 } 33 for(int i=0;i<4;++i){ 34 if(f[n][i]){ 35 puts("YES"); 36 out(n-1,pre[n][i]); 37 cout<<i<<endl; 38 return 0; 39 } 40 } 41 puts("NO"); 42 return 0; 43 }