首页 > 代码库 > hdu1176免费馅饼

hdu1176免费馅饼

先看题: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;}

 

hdu1176免费馅饼