CF-517B-DP

时间:2021-07-18 09:44:44

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是否可行,记录下路径就好了。

 #include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define LL long long
const int maxn=+;
int n,a[maxn],b[maxn];
bool f[maxn][];
int pre[maxn][];
void out(int n,int i){
if(n==) return;
out(n-,pre[n][i]);
cout<<i<<' ';
}
int main(){
cin>>n;
for(int i=;i<n;++i) cin>>a[i];
for(int i=;i<n;++i) cin>>b[i];
memset(pre,-,sizeof(pre));
f[][]=f[][]=f[][]=f[][]=;
for(int i=;i<=n;++i){
for(int j=;j<;++j){
if(f[i][j]){
for(int k=;k<;++k){
if((j|k)==a[i] && (j&k)==b[i]){
f[i+][k]=;
pre[i+][k]=j;
}
}
}
}
}
for(int i=;i<;++i){
if(f[n][i]){
puts("YES");
out(n-,pre[n][i]);
cout<<i<<endl;
return ;
}
}
puts("NO");
return ;
}

相关文章