[USACO08JAN] Running S - dp

需要进行 \(n\) 分钟的晨跑,在第 \(i\) 分钟内可以跑 \(d_i\) 米,疲劳度会增加 \(1\),无论何时疲劳度不能超过 \(m\),休息一分钟疲劳度会减少 \(1\),休息就必须要休息到疲劳度为 \(0\),疲劳度恢复到 \(0\) 就不会继续下降。初态下疲劳度为 \(0\)。结束时疲劳度也必须恢复到 \(0\)。求最多能跑多远。\(n \leq 10^4, d_i \leq 1000, m \leq 500\)

Solution

\(f[i][j]\) 表示考虑前 \(i\) 分钟,结束时疲劳度为 \(j\),所能获得的最大距离,转移时决策这一秒是跑还是开始休息即可

读错题毁一生

#include <bits/stdc++.h>
using namespace std;

const int N = 20005;
int n,m,d[N],f[N][505];

void sh(int &x,int y) {
    x=max(x,y);
}

signed main() {
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>d[i];
    for(int i=1;i<=n;i++) {
        for(int j=0;j<=m;j++) {
            sh(f[i][j+1],f[i-1][j]+d[i]);
            if(j==0) sh(f[i][j],f[i-1][j]);
            sh(f[i+j-1][0],f[i-1][j]);
        }
    }
    cout<<f[n][0];
}

猜你喜欢

转载自www.cnblogs.com/mollnn/p/12443757.html