ランニングランニング羅区P1353 USACO

タイトル

すべての最初のエントリDPは、質問を理解する必要があります。

簡単状態描く\(DP [I] [j]が\)の最大距離は、I回J疲労が得られるように定義されます

0に続けることができ、すべての疲労疲労の最初の二つのピットがあります。

最初の式:
\(DP [I] [0] = MAX(DP [-I 1] [0]、D [I] [0])\)

あなたは残りの部分を休ましたい場合は疲労値0の前に停止する必要があります。

私たちは、第2式を持っています:

\(DP [I] [0 ] = MAX(DP [I] [0]、DPは[IJ] [j]は)\) を意味し、0の最大距離は、値jは疲労位置ijがある疲労位置Iの程度J休みの日の最大距離。

残りは実行された式の意味に従ってトピックが選択されていません。

\(DP [I] [J] = MAX(DP [I]、[J]、DP [I - 1] [J - 1] + D [i])と\)

パーフェクト完璧な遷移シーケンスプログラムを得ることができます。

#include <bits/stdc++.h>
#define N 1000101
#define int long long
using namespace std;
int n, m, d[N], dp[10031][531];//第n分钟必须休息到0
signed main()
{
//  freopen("data.in", "r", stdin);
    scanf("%lld%lld", &n, &m);  
    for (int i = 1; i <= n; i++)
        scanf("%lld", &d[i]);   
    for (int i = 1; i <= n; i++)
    {
        dp[i][0] = max(dp[i - 1][0], dp[i][0]);
        for (int j = 1; j <= m; j++)
            dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + d[i]);//不休息
        for (int j = 1; j <= min(m, n); j++)//休息
            dp[i][0] = max(dp[i][0], dp[i - j][j]);//i位置不疲劳的状态的值
    }
    for (int i = n; i <= n; i++)
        printf("%lld ", dp[i][0]);
    return 0;
}

おすすめ

転載: www.cnblogs.com/liuwenyao/p/11665061.html