HDU 1176 免费馅饼
TEST<28>(11-11)
解题思路
从后往前推出每一秒每个位置的 最大馅饼的数量
因为 每一秒 此位置的 馅饼总数量都是由前一秒
可能的 3个位置 位移产生(+1,0,-1)每次每个位置
都取最大值 呢么 最终 起点的 也是整个的最大值
dp[][]数组作为最大值累计数组,a[][]作为馅饼掉落标记数组
AC 代码如下
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#define INF 100002
using namespace std;
int dp[100005][15], a[100005][15];
int main(){
int n;
while(~scanf("%d",&n) && n){
memset(dp, 0, sizeof(dp));
memset(a, 0, sizeof(a));
int maxn = -1;
for(int i = 0; i < n; i++){
int x,y;
scanf("%d %d",&x,&y);
maxn = max(maxn, y);//找到最大的时间
a[y][x]++; //累加标记 掉落的馅饼
}
for(int i = maxn; i >= 0; i--){
//0的时候特判,10的时候因为 11一定为零所以无需特判不会 干扰结果
dp[i][0] = max(dp[i+1][0], dp[i+1][1]) + a[i][0];
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])) + a[i][j];
}
}
printf("%d\n",dp[0][5]);
}
return 0;
}