Hướng dẫn giải của Atcoder Educational DP Contest K - Stones


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Độ phức tạp thời gian: ~O(N \times K)~.

Gọi ~dp[i]~ là khả năng Taro có thể thắng khi có ~i~ hòn đá. Ta sẽ chạy 2 vòng lặp, một vòng lặp cho các giá trị ~i (1 \leq i \leq K)~, vòng lặp còn lại cho mỗi giá trị trong ~A~. Nếu ~i \geq a_j ~, và chúng ta không thể thắng khi có ~i-a_j~ hòn đá, thì do đó ta có thể thắng được khi có ~i~ hòn đá.

#include <bits/stdc++.h>

using namespace std;

int main() {
    cin.tie(0)->sync_with_stdio(0);

    int n, k;
    cin >> n >> k;
    vector<int> a(n);
    for (int& x : a) cin >> x;
    vector<bool> dp(k + 1);
    for (int i = 1; i <= k; ++i)
        for (int j : a)
            if (i >= j && !dp[i - j])
                dp[i] = 1;
    cout << (dp[k] ? "First" : "Second") << '\n';
}

Bình luận

Hãy đọc nội quy trước khi bình luận.



  • 15
    ntnguyen  đã bình luận lúc 24, Tháng 9, 2021, 3:51

    Độ phức tạp theo lời giải phải là O(K*N) chứ ạ.


    • 1
      leduykhongngu  đã bình luận lúc 24, Tháng 9, 2021, 4:05

      mình đã sửa, cám ơn bạn nhé