DPSEQ - Trò chơi với dãy số

Xem dạng PDF

Gửi bài giải


Điểm: 1,00 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 256M

Tác giả:
Dạng bài
Ngôn ngữ cho phép
C, C#, C++, Go, Java, Pascal, Perl, PHP, PyPy, Python, Ruby, Rust, Scratch, Swift

Trên trục tọa độ, tại các điểm có tọa độ nguyên trong đoạn ~[1;N]~ có ghi các số ~a_i~. Ban đầu người chơi đứng ở điểm có tọa độ là ~0~ với tổng điểm là ~0~. Mỗi bước di chuyển người chơi có thể di chuyển sang phải tối thiểu là ~1~ bước, tối đa là ~K~ bước. Khi đến điểm nào thì số nguyên ở điểm đó sẽ được cộng vào tổng điểm của người chơi. Người chơi có thể dừng lại bất cứ khi nào họ muốn. Hãy tìm cách chơi để đạt tổng điểm lớn nhất.

Input

  • Dòng đầu chứa hai số nguyên dương ~N~ và ~K~ cách nhau bởi một khoảng trắng;
  • Dòng thứ hai ghi ~N~ số ~a_1, a_2, \ldots. a_N~, mỗi số cách nhau bởi một khoảng trắng.

Giới hạn:

  • ~2 ≤ N ≤ 10000; 1 ≤ k ≤ 10 -1000 ≤ a_i ≤ 1000~

Output

  • Giá trị tổng điểm lớn nhất mà người chơi có thể giành được.

Sample

Input #1
5 2
-2 3 -6 -4 5
Output #1
4

Hint

  • Xem ví dụ #1, người chơi di chuyển như sau: ~0→2→4→5~, tổng điểm là ~3 + (-4) + 5 = 4~

Problem source: Chuyên Sơn La Online Judge


Bình luận

Please read the guidelines before commenting.



  • 0
    mducc  đã bình luận lúc 2, Tháng 6, 2026, 10:16

    Hint: *Ý tưởng *

    • dp[i] = tổng điểm lớn nhất để đến được ô i.
    • Xuất phát từ dp[0] = 0, từ mỗi ô i thử nhảy sang các ô i+1 đến i+k.
    • Cập nhật: dp[ni] = max(dp[ni], dp[i] + a[ni]).
    • Độ phức tạp: O(N*K).
    • Đáp án = max(dp[1..n], 0).

    code tham khảo (c++)

    #include <bits/stdc++.h>
    using namespace std;
    int main() {
        ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
        int n, k;
        cin >> n >> k;
        int a[10005], dp[10005];
        for (int i = 1; i <= n; i++) cin >> a[i];
        for (int i = 0; i <= n; i++) dp[i] = -1e9;
        dp[0] = 0;
        for (int i = 0; i <= n; i++) {
            if (dp[i] == -1e9) continue;
            for (int j = 1; j <= k; j++) {
                int ni = i + j;
                if (ni > n) break;
                dp[ni] = max(dp[ni], dp[i] + a[ni]);
            }
        }
        int ans = 0;
        for (int i = 1; i <= n; i++) ans = max(ans, dp[i]);
        cout << ans << "\n"; 
        return 0;
    }
    

  • -1
    congtyluuthaibao1978  đã bình luận lúc 24, Tháng 11, 2025, 13:34

    include <bits/stdc++.h>

    using namespace std; int main() { ios::syncwithstdio(false); cin.tie(nullptr); int N, K; cin>>N>>K; vector<int> a(N+1); for(int i = 1; i <= N; i++){ cin >> a[i]; } const int NEGINF=-1000000000; vector<int>dp(N+1,NEGINF); dp[0]=0; for(int i=0;i<=N;i++){ if(dp[i]==NEG_INF)continue; for(int j = 1; j <= K; j++){ int ni = i + j; if(ni > N) break; dp[ni] = max(dp[ni], dp[i] + a[ni]); } } int ans = 0; for(int i = 1; i <= N; i++){ ans = max(ans, dp[i]); } cout << ans << "\n"; return 0; }


  • -3
    congtyluuthaibao1978  đã bình luận lúc 24, Tháng 11, 2025, 13:33

    include <bits/stdc++.h>

    using namespace std; int main() { ios::syncwithstdio(false); cin.tie(nullptr); int N, K; cin>>N>>K; vector<int> a(N+1); for(int i = 1; i <= N; i++){ cin >> a[i]; } const int NEGINF=-1000000000; vector<int>dp(N+1,NEGINF); dp[0]=0; for(int i=0;i<=N;i++){ if(dp[i]==NEG_INF)continue; for(int j = 1; j <= K; j++){ int ni = i + j; if(ni > N) break; dp[ni] = max(dp[ni], dp[i] + a[ni]); } } int ans = 0; for(int i = 1; i <= N; i++){ ans = max(ans, dp[i]); } cout << ans << "\n"; return 0; }


  • -3
    congtyluuthaibao1978  đã bình luận lúc 24, Tháng 11, 2025, 13:33

    bao đúng


  • -3
    congtyluuthaibao1978  đã bình luận lúc 24, Tháng 11, 2025, 13:32

    include <bits/stdc++.h>

    using namespace std; int main() { ios::syncwithstdio(false); cin.tie(nullptr); int N, K; cin>>N>>K; vector<int> a(N+1); for(int i = 1; i <= N; i++){ cin >> a[i]; } const int NEGINF=-1000000000; vector<int>dp(N+1,NEGINF); dp[0]=0; for(int i=0;i<=N;i++){ if(dp[i]==NEG_INF)continue; for(int j = 1; j <= K; j++){ int ni = i + j; if(ni > N) break; dp[ni] = max(dp[ni], dp[i] + a[ni]); } } int ans = 0; for(int i = 1; i <= N; i++){ ans = max(ans, dp[i]); } cout << ans << "\n"; return 0; }


  • -1
    lapdz2008  đã bình luận lúc 16, Tháng 10, 2025, 11:18 sửa 2

    include <bits/stdc++.h>

    define fi first

    define se second

    define el '\n'

    define pii pair<int,int>

    define yes cout << "YES"

    define no cout << "NO"

    define pb push_back

    define all(x) x.begin(),x.end()

    using namespace std; typedef long long ll; typedef double db;

    const ll mod = 1e9+7; const ll maxn = 1e5+7; const db pi = 3.14159265; const ll inf = 1e18;

    ll n,k,ans=0; ll a[maxn],dp[maxn];

    signed main() { iosbase::syncwith_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> k; for(int i = 1; i <= n; ++i) cin >> a[i];

    for(int i = 0; i <= n; ++i) dp[i] = -inf;
    dp[0] = 0;
    for (int i = 0; i < n; ++i){
        if(dp[i] == -inf) continue;
        for(int j = 1; j <= k && i + j <= n; ++j){
            dp[i+j] = max(dp[i+j], dp[i] + a[i+j]);
        }
    }
    for(int i = 1; i <= n; ++i) ans = max(ans, dp[i]);
    cout << ans;
    cerr << el << "Time :" << clock()*1.0 / CLOCKS_PER_SEC << "S.\n";
    return 0;
    

    }