免费馅饼

题意分析:0~10的区间内,初始位置为5.每次移动一个单位,可接到馅饼的区间为x,x-1,x+1。多组输入:每组n个馅饼,t时间在x处掉落。输出:一个回合可接到最多馅饼数。

 

做题思路:dp

1.dp[t][x]//t时间在x处收到的最大馅饼数

2.边界的话……“补零给时刻和位置的计量值都+1, 即可空出一个0位. 这样之后, j的边界变为(1~11), 初始位置为6, 初始时刻为1. 将0位保持为0, 即可简化讨论情况, 不影响结果.

3.顺序,t倒着推,最大t开始,倒回起点。x无所谓。

4.dp[t][x]+=max(dp[t+1][x-1],dp[t+1][x],dp[t+1][x+1]);

 

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;

#define INF 0x3f3f3f3f

int dp[100010][15];//t秒时x处掉落馅饼

int main() {
    int n;
    while ((cin >> n) && n != 0) {
        memset(dp, 0, sizeof(dp));
        int maxt = -INF;
        for (int i = 0; i < n; i++) {
            int x, t;
            cin >> x >> t;
            dp[++t][++x]++;
            maxt = max(maxt, t);
        }
        for (int i = maxt; i > 0; i--) {
            for (int j = 1; j <= 11; j++) {
                dp[i][j] += max(dp[i + 1][j], max(dp[i + 1][j - 1], dp[i + 1][j + 1]));
            }
        }
        cout << dp[1][6] << endl;
    }

    return 0;
}

 

posted @ 2020-08-05 11:11  sos3210  阅读(473)  评论(0)    收藏  举报