免费馅饼 HDU

/*题都是有一个状态转移方程式 ,
只要推出方程式就问题不大了,首
先对于gameboy来说他下一秒只能
在0~10这十一个位置移动,
而对于1~9这九个位置来说他可以移动(假设他现在的位置为x)到x+1,或者x-1,或者x;
0和10这两个位置只有两个位置可以移动,
可以用dp[t][x],t秒的馅饼获得就看t-1秒时的下一位置(x+1,x,x-1)
因为要求整个过程的最大值,因此求的是dp累加的和,
所以状态转移方程式为  dp[i][j]+=max(dp[i+1][j-1],max(dp[i+1][j],dp[i+1][j+1]));
*/
#include<cstring>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<stdio.h>
using namespace std;
int dp[150000][20];
int main()
{
    int n;
    while(scanf("%d",&n),n)
    {
        int t,x,tt=0;
        memset(dp,0,sizeof(dp));
        for(int i=0; i<n; i++)
        {
            scanf("%d %d",&x,&t);
            //t是时间
            //x+1是位置加1
            dp[t][x+1]++;
            tt=max(tt,t);
        }
        int res=0;
        //只有最开始的位置是确定的,所以从后面的时间往前
        for(int i=tt-1; i>=0; i--)
            //往前面推,在此位置接到的馅饼数,是这一位置接到的加上上一秒接到的和
            for(int j=12; j>=0; j--)
                dp[i][j]+=max(dp[i+1][j-1],max(dp[i+1][j],dp[i+1][j+1]));
        //初始位置在5号位置, 
        cout<<dp[0][6]<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/QingyuYYYYY/p/12238298.html