原题地址
这道题是动态规划的基础题,但是有一些变形,于是刚学动态规划的我,就光荣的不会了。。。。
看着大佬们花式AC,心里不是滋味的我,上网看了一下题解
发现关于动态规划的问题,首先要思考一下他的状态转移方程式是什么,然后根据题意来推断出状态转移方程,接下来的事情就是用数组解决即可
这道题的题意是,一个蒻鶸每秒只能移动一米,然后在0-15米内随机掉馅饼,问这个人最多能拿多少
首先发现当前的位置是由前一秒的位置决定,前一秒的位置由前前一秒的位置决定,直到初始的5。所以,可以设一个数组dp来记录当前位置和当前时间。
其次因为移动分为x-1,x,x+1,且求得是累计的馅饼最大数
所以方程为dp[i][j]+=max(dp[i+1][j],max(dp[i+1][j-1],dp[i+1][j+1]));
代码如下:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <iomanip>
#include <string.h>
#include <sstream>
#define INF 999999999

using namespace std;
struct shi{
    int x;
    int T;
}s[100000];
int cmp(shi a,shi b){
    return a.x<b.x;
    }
long long cmd(long long a , long long  b){
    return a > b;
}
int dp[150000][17];
int a[100000];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF){
        if(n==0)
            break;
        memset(dp,0,sizeof(dp));
        int sum=0;
        for(int i=0;i<n;i++)
        {
            int x , t;
            scanf("%d %d",&x,&t);
            dp[t][x+1]++;
            sum=max(sum,t);
        }
        for(int i=sum-1;i>=0;i--){
            for(int j=14;j>=0;j--)
                dp[i][j]+=max(dp[i+1][j-1],max(dp[i+1][j],dp[i+1][j+1]));
        }
        printf("%d\n",dp[0][6]);

    }

    return 0;

}