HDU - 2182 - カエル(基本DP)

トピックリンク
タイトル効果:からカエル(0 \)\で始まる([0、N)\ \ ) の各ステップ、ジャンプの配置を得ることができる直後各値の範囲内でジャンプ(出発点を考慮することができます)サイズ\([A、B] \) 最大ジャンプ\(K \)のステップは、あなたの最高をお願いします。
  私たちはまず、すべての場合、最初のステップ、カエルは最初からジャンプすることができます想像してみましょう\(E(E \で[A、B]を)\) それは落下カエルできる場所から第二工程、(S \)\(オフで\(S \ [A、B] \) )、スキップ(E(E \で[\ + S、B + S] )\) 明らかに、カエルの値を取得することができ、各ステップは、出発点の値を加えた値の配置は、最大値は最大値+配置の値の出発点です。集合\(S \)位置から、\(E \)終点の位置であり、\(K \)最初のための\(K \)工程、\(A [E] \)\(E \)ポイント値は、その後、状態遷移方程式は、\(DP [E] [K] = MAX(DP [E] [K]、DP [S] [-K 1] + [K])\)

const int maxn = 1e2+10;
int dp[maxn][maxn], arr[maxn];
int main(void) {
    int t;
    scanf("%d", &t);
    while(t--) {
        int n, a, b, m;
        scanf("%d%d%d%d", &n, &a, &b, &m);
        zero(dp);
        for (int i = 0; i<n; ++i) scanf("%d", &arr[i]);
        int ans = 0; dp[0][0] = arr[0];
        for (int i = 1; i<=m; ++i) //步数
            for (int j = 0; j<n; ++j) //起点位置
                if (dp[j][i-1])
                    for (int k = a+j; k<=b+j && k<n; ++k) { //每步的大小
                        dp[k][i] = max(dp[k][i], dp[j][i-1]+arr[k]);
                        ans = max(ans, dp[k][i]);
                    }
        printf("%d\n", ans);
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/shuitiangong/p/12650634.html