题意:Bessie参加跑步比赛,每一分钟可以选择跑或者休息,同时给出每一分钟如果跑的话,可以跑的距离:跑的话,疲劳度会加1;休息的话,疲劳度减1;且疲劳度不可以超过m。跑完后疲劳度必须为0,求满足条件可以跑得最远距离。
思路:我自己按照直观想的3维dp。dp[i][j][0] 表示第i分钟之后,疲劳度为j,且第i分钟在休息的最大值;dp[i][j][1]表示第i分钟之后,疲劳度为j,且第i分钟在跑步的最大值。复杂度为O(nm),能A。
那么有dp[i][j][1] = dp[i-1][j-1][1] + s[i] , j>0
dp[i][0][1] = max(max(dp[i-1][1][0],dp[i-1][1][1]),dp[i-1][0][1]), j=0
dp[i][j][0] = max(dp[i-1][j+1][0] , dp[i-1][j+1][j])。
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <cstdlib> using namespace std; #define clc(s,t) memset(s,t,sizeof(s)) #define INF 0x3fffffff #define N 10005 int dp[N][505][2]; int s[N]; int n,m; int main(){ int i,j; scanf("%d %d",&n,&m); for(i = 1;i<=n;i++) scanf("%d",&s[i]); clc(dp,0); for(i = 1;i<=n;i++){ dp[i][0][1] = max(max(dp[i-1][1][0],dp[i-1][1][1]),dp[i-1][0][1]); for(j = 1;j<=m;j++){ dp[i][j][1] = dp[i-1][j-1][1]+s[i]; dp[i][j][0] = max(dp[i-1][j+1][0],dp[i-1][j+1][1]); } } printf("%d\n",dp[n][0][1]); }