top1编程
← 返回题目
题解

【入门】跳格子2

1 条题解

  • 0
    @ 2026-7-29 0:16:20
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    const int MAXN = 100005;
    long long dp[MAXN];
    long long x[MAXN];
    
    int main() {
        int n, A, B, C;
        cin >> n >> A >> B >> C;
    
        // 生成数列
        for (int i = 1; i <= n; i++) {
            long long tmp = (1LL * A * i * i + B * i + C) % 20000;
            x[i] = tmp - 10000;
        }
    
        // DP:dp[i] 表示跳到位置 i 时的最小得分
        dp[0] = 0;  // 起点,无得分
    
        if (n >= 1) {
            dp[1] = x[1] + dp[0];  // 只能从 0 跳来
        }
        if (n >= 2) {
            dp[2] = x[2] + min(dp[1], dp[0]);  // 从 1 或 0 跳来
        }
    
        for (int i = 3; i <= n; i++) {
            dp[i] = x[i] + min(dp[i-1], dp[i-2]);
        }
    
        // 最终跳到 n+1,只能从 n-1 或 n 跳
        long long ans = min(dp[n], dp[n-1]);
    
        cout << ans << endl;
    
        return 0;
    }
    
    • 1