poj 3661 Running (dp)

1401 단어 dppoj
제목:
n, m, n은 n분이 있음을 나타낸다. i분마다 대응하는 것은 i분마다 뛸 수 있는 거리이다. m는 최대 피로도를 나타낸다. 1분마다 뛸 때 피로도 +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
",dp[n][0]); } return 0; }

좋은 웹페이지 즐겨찾기