洛谷 題解 P1353 【[USACO08JAN]跑步Running】
阿新 • • 發佈:2019-05-07
clu line turn 規劃 read () getchar mes its
動態規劃
- 狀態
dp[i][j]表示第i分鐘疲勞值為j的最大值
- 初始
全部都為一個最小值“0”
- 轉移
考慮休息和走
如果當前疲勞值比時間要大,顯然不可能出現這種情況
如果比時間小
dp[i][0]=max(dp[i][0],dp[i-j][j]);
還有走的情況
dp[i][0]=max(dp[i-1][j-1]+d[i],dp[i][j]);
- 答案
根據設計的狀態不難得出最終的答案為dp[n][0]
完整代碼:
#include<bits/stdc++.h> using namespace std; const int MAXN=10000+10; const int MAXM=500+10; int n,m; int d[MAXN]; int dp[MAXN][MAXM]; inline int read() { int tot=0; char c=getchar(); while(c<'0'||c>'9') c=getchar(); while(c>='0'&&c<='9') { tot=tot*10+c-'0'; c=getchar(); } return tot; } int main() { n=read();m=read(); for(int i=1;i<=n;i++) d[i]=read(); for(int i=1;i<=n;i++) { dp[i][0]=dp[i-1][0]; for(int j=1;j<=m;j++) { if(i-j>=0)dp[i][0]=max(dp[i][0],dp[i-j][j]); dp[i][j]=max(dp[i-1][j-1]+d[i],dp[i][j]); } } cout<<dp[n][0]<<endl; return 0; }
洛谷 題解 P1353 【[USACO08JAN]跑步Running】