HDU 1176

来源:互联网 发布:数据库mdf文件过大 编辑:程序博客网 时间:2024/06/07 04:10

有一个数轴,0-11,人站在5的位置,天上开始掉馅饼;
人的移动速度为1,就是第一秒内只能接住4,5,6其中一个,给出馅饼掉落的位置和时间,问最多能得到多少个馅饼;
我们知道起始位置,但是不知道末位置;
用一个矩阵数组,二维数组dp来表示馅饼;
dp[i][j],i代表出现的时间,j代表位置(为了好计算我们把位置全部加1,变为1-11);
我们不知道时间多长,记录最大时间,利用时间来计算最大数量;
倒着遍历时间,然后遍历每一个位置
dp[i][j] i代表时间i,j代表j位置的时候接的最大数
状态转移方乘为
dp[i][j] += max(dp[i+1][j], max(dp[i+1][j-1], dp[i+1][j+1]));
一个人需要可以接3个位置,所以需要判断3个,边界除外
最后输出起点即可

#include<iostream>#include<algorithm>#include<cstring>using namespace std;const int maxn = 99999 + 5;int dp[maxn][15];int main () {    int n;    while(cin >> n && n) {        memset(dp, 0, sizeof dp);        int a, b, t = 0;        for(int i = 1; i <= n; i++) {            scanf("%d %d", &a, &b);            dp[b][a+1]++;            t = max(t, b);        }        for(int i = t-1; i >= 0; i--) {            for(int j = 11; j >= 1; j--) { //不能多                 dp[i][j] += max(dp[i+1][j], max(dp[i+1][j-1], dp[i+1][j+1]));            }        }           cout << dp[0][6] << endl;    }    return 0;}