ABC245 C - Choose Elements

■考えたこと
dpのような気がしたので入力例1の値で以下の表を書いてみた。

9 1
8 6
3 2
7 9
2 5
i \ j 0 1
0 true true
1 true true
2 true true
3 true false
4 false true

dpの定義は以下。
dp[i][j] = A[i][j]が条件を満たすかどうか。
dp[0][0] = dp[0][1] = true
dp[n - 1][0] または dp[n - 1][1] がtrueならYes。

以下はACしたコード。

int main() {
	int n, k;
	cin >> n >> k;
	vector<vector<int>> a(n, vector<int>(2));
	for (int i = 0; i < n; i++) cin >> a[i][0];
	for (int i = 0; i < n; i++) cin >> a[i][1];

	vector<vector<bool>> dp(n, vector<bool>(2, false));
	dp[0][0] = dp[0][1] = true;
	for (int i = 0; i < n - 1; i++) {
		for (int j = 0; j < 2; j++) {
			if (!dp[i][j]) continue;
			for (int l = 0; l < 2; l++) {
				if (abs(a[i + 1][l] - a[i][j]) <= k) {
					dp[i + 1][l] = true;
				}
			}
		}
	}
	
	for (int j = 0; j < 2; j++) {
		if (dp[n - 1][j]) {
			cout << "Yes" << endl;
			return 0;
		}
	}
	cout << "No" << endl;
}