0
点赞
收藏
分享

微信扫一扫

[abc] AtCoder Beginner Contest 245 C 线性dp

独西楼Q 2022-03-30 阅读 76
c++

前言

传送门 :

题意

给你两个数组 b [ ] , a [ ] b[],a[] b[],a[]询问是否有

x i = a i ∣ ∣ b i x_i=a_i||b_i xi=aibi
∣ x i − x i − 1 < = k ∣ |x_i-x_{i-1}<=k| xixi1<=k

思路

状态表示 : d p [ i ] [ 2 ] ( b o o l ) dp[i][2] ( bool) dp[i][2](bool)
当前在 i i i节点 a [ i ] ∣ ∣ b [ i ] a[i]||b[i] a[i]b[i]是否可 用

  • d p [ i ] [ 0 ] = 0 dp[i][0]=0 dp[i][0]=0 表示第 a [ i ] a[i] a[i]不可用
  • d p [ i ] [ 1 ] = 0 dp[i][1]=0 dp[i][1]=0 表示第 b [ i ] b[i] b[i]不可用

状态计算 :

  • d p [ i ] [ 0 ] dp[i][0] dp[i][0]可以从 d p [ i − 1 ] [ 0 ] = d p [ i − 1 ] [ 1 ] = 1 dp[i-1][0]=dp[i-1][1]=1 dp[i1][0]=dp[i1][1]=1转移
  • d p [ i ] [ 1 ] dp[i][1] dp[i][1]可以从 d p [ i − 1 ] [ 0 ] = d p [ i − 1 ] [ 1 ] = 1 dp[i-1][0]=dp[i-1][1]=1 dp[i1][0]=dp[i1][1]=1转移

初始化状态 :
d p [ 1 ] [ 1 ] = d p [ 0 ] [ 1 ] = 1 dp[1][1] =dp[0][1]=1 dp[1][1]=dp[0][1]=1


才少打一场 a b c abc abc,这个 C C C就不是一眼题了Orz

Mycode

const int N  = 2e5+10;
int n,k;
int a[N],b[N];
int dp[N][2];

void solve()
{

	cin>>n>>k;
	
	for(int  i=1;i<=n;i++)cin>>a[i];
	for(int  i=1;i<=n;i++)cin>>b[i];
	
	dp[1][0] = dp[1][1] = 1;
	
	for(int i=2;i<=n;i++){
		
		if(dp[i-1][0] && abs(a[i] - a[i-1]) <=k ) dp[i][0] = 1;
		else if(dp[i-1][1] && abs(a[i] - b[i-1]) <=k ) dp[i][0] = 1;

		
		if(dp[i-1][0] && abs(b[i] - a[i-1]) <=k) dp[i][1] = 1;
		else if(dp[i-1][1] && abs(b[i] - b[i-1])<=k) dp[i][1] = 1;

	}
	
	if(dp[n][0] || dp[n][1]){
		cout<<"Yes"<<endl;
		return;
	}
	
	cout<<"No"<<endl;
	
}
举报

相关推荐

0 条评论