■考えたこと
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; }