猴子

来源:互联网 发布:steam免费mac游戏推荐 编辑:程序博客网 时间:2024/05/17 02:11
猴子
Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 69   Accepted Submission(s) : 18

Font: Times New Roman | Verdana | Georgia

Font Size:

Problem Description

一只猴子找到了很多香蕉树,这些香蕉树都种在同一直线上,而猴子则在这排香蕉树的第一棵树上。这只猴子当然想吃尽量多的香蕉,但它又不想在地上走,只想从一棵树跳到另外一棵树上。同时猴子的体力有限,它不能一次跳到太远或跳得次数太多。每当它跳到一棵树上,就会把那棵树上的香蕉都吃掉。那么它最多能吃多少个香蕉呢?

Input

输入的第1行为三个整数,分别是香蕉树的棵树N,猴子每次跳跃的最大距离D,最多跳跃次数M。
下面N行每行包括两个整数,ai,bi分别表示每棵香蕉树上的香蕉数,以及这棵树到猴子所在树的距离。输入保证这些树按照从近到远排列,并且没有两棵树在同一位置。b0总是为0。

Output

对于每个输入输出包含一个整数为猴子最多能吃到的香蕉数。

Sample Input

5 5 26 08 34 56 79 10

Sample Output

20

 

二维dp

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

struct xx
{
    int x,y;
}a[1005];

int dp[1005][1005];

int main()
{
    //freopen("a.txt","r",stdin);
    int m,n,t;
    while(cin>>n>>m>>t)
    {
        int i,j,k,maxx=0;
        memset(dp,-1,sizeof(dp));
        for(i=1;i<=n;i++) cin>>a[i].x>>a[i].y;
        dp[1][0]=a[1].x;
        for(i=1;i<=n;i++)
        {
            for(j=0;j<t;j++)
            {
                if(dp[i][j]!=-1)
                {
                   for(k=i+1;k<=n;k++)
                   {
                       if(a[k].y-m<=a[i].y)
                       {dp[k][j+1]=max(dp[i][j]+a[k].x,dp[k][j+1]);}
                       else break;
                   }
                }
            }
        }
        for(i=1;i<=n;i++)
        {
            for(j=0;j<=t;j++)
            {
                if(maxx<dp[i][j]) maxx=dp[i][j];
            }
        }
        cout<<maxx<<endl;
    }
    return 0;
}

 

原创粉丝点击