poj 3661 Running (dp)

题意:

给你一个n,m,n表示有n分钟,每i分钟对应的是第i分钟能跑的距离,m代表最大疲劳度,每跑一分钟疲劳度+1,当疲劳度==m,必须休息,在任意时刻都可以选择休息,如果选择休息,那么必须休息到疲劳度为0,当然,当疲劳度为0的时候也是可以继续选择休息的,求在n分钟后疲劳度为0所跑的最大距离。

题解:

状态:dp[i][j] 第i分钟疲劳度为j的时候走的最大距离

注意:分情况讨论。

/*
状态:
dp[i][j]表示“开区间”内的数都被取走了所得的最大值,开区间着重号!容易错!
*/
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
using namespace std;
typedef long long lld;
#define oo 0x3f3f3f3f
#define maxn 10000+5
#define maxm 500+5
int dp[maxn][maxm];
int d[maxn];

int main()
{
    int n,m;
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&d[i]);
        memset(dp,-1,sizeof dp);
        dp[1][0]=0;
        dp[1][1]=d[1];
        for(int i=1;i<n;i++)
        {
            for(int j=0;j<=m;j++)
            {
                if(dp[i][j]==-1) continue;
                if(j+1<=m)
                    dp[i+1][j+1]=max(dp[i+1][j+1],dp[i][j]+d[i+1]);
                if(j==0)
                    dp[i+1][0]=max(dp[i+1][0],dp[i][0]);
                if(0<j&&i+j<=n)
                    dp[i+j][0]=max(dp[i+j][0],dp[i][j]);
            }
        }
        printf("%d\n",dp[n][0]);
    }
	return 0;
}






你可能感兴趣的:(dp,poj)