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 }
原文地址:https://www.cnblogs.com/zzqc/p/9843757.html