先看题:http://acm.hdu.edu.cn/showproblem.php?pid=1176

这道题的状态转移方程不难找到dp[i][j] += max(dp[i + 1][j + 1],dp[i-1][j+1],dp[i][j+1])   表示在第j秒的时候在i这个位置能接到的馅饼数 可是有两个特殊位置 0和10,这两个位置的状态转移方程需要另写dp[0][j] += max(dp[0][j+1],dp[1][i+1])   dp[10][j] += max(dp[10][j+1],dp[9][i+1]);

但是需要注意的是我们这个递推一定要从时间的最后开始推 不然也没法推  下面看代码

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

int dp[11][100001];

inline int Max(int a, int b, int c=-1)  //这个函数很有意思  可以求两个数中最大的也可以求三个数最大的  可以研究研究
{
    if(a < b) a = b;
    if(a < c) a = c;
    return a;
}

int main()
{
    int n, i, j;
    int t, x;
    while (~scanf("%d", &n)&& n)
    {
        memset(dp, 0, sizeof(dp));
        int MaxTime = 0;
        for (i=0; i<n; i++)
        {
            scanf("%d%d", &x, &t);
            dp[x][t]++;
            MaxTime = t>MaxTime ? t:MaxTime;  //求最大时间是多少
        }
        for (j=MaxTime-1; j>=0; j--)    //j一定为最大时间-1
        {
            dp[0][j] += Max(dp[0][j+1], dp[1][j+1]);
            dp[10][j] += Max(dp[10][j+1], dp[9][j+1]);
            for (i=1; i<10; i++)
            {
                dp[i][j] += Max(dp[i][j+1], dp[i+1][j+1], dp[i-1][j+1]);
            }
        }
        printf("%d\n", dp[5][0]);  //输出5这个位置0秒时就行了
    }
    return 0;
}