HDU1176 免费馅饼

2017年8月11日

馅饼都掉落在0-10这11个位置。开始时gameboy站在5这个位置,因此在第一秒,他只能接到4,5,6这三个位置中其中一个位置上的馅饼。问gameboy最多可能接到多少个馅饼?(假设他的背包可以容纳无穷多个馅饼) .

经典 DP 问题中有一个数塔问题,数塔问题只能往两个方向走,而这个问题就是数塔问题的衍生版,这个问题可以往三个方向走.定义 dp[i][j] 为时间为i,所在位置为j时所能得到的最大数量.那么就有dp[i][j] += max(dp[i + 1][j - 1], dp[i + 1][j], dp[i + 1][j + 1])

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1176

#include <cstdio>
#include <cstring>
using namespace std;
const int N = (int)1e5 + 5;
int dp[N][15];
int max(int a, int b, int c)
{
    if (a >= b && a >= c)
        return a;
    else if (b >= a && b >= c)
        return b;
    else
        return c;
}
int main()
{
    int n;
    while (~scanf("%d", &n) && n) {
        int time = 0;
        memset(dp, 0, sizeof(dp));
        for (int i = 0; i < n; i++) {
            int t, x;
            scanf("%d %d", &x, &t);
            dp[t][x]++;
            time = max(time, t, 0);
        }
        for (int i = time; i >= 0; i--) {
            for (int j = 0; j <= 10; j++) {
                if (j == 0) {
                    dp[i][j] += max(dp[i + 1][j], dp[i + 1][j + 1], 0);
                } else if (j == 10) {
                    dp[i][j] += max(dp[i + 1][j - 1], dp[i + 1][j], 0);
                } else {
                    dp[i][j] += max(dp[i + 1][j - 1], dp[i + 1][j], dp[i + 1][j + 1]);
                }
            }
        }
        printf("%d\n", dp[0][5]);
    }
    return 0;
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注