题意:掉馅饼问题,每秒钟掉的馅饼可能不同,地点也可能不同,gameboy在一秒钟之内只能接住所在位置或相邻位置的馅饼求规定时间内所能接住馅饼的最大值。
思路:可转化为矩阵问题,行代表时间,列代表每个位置所掉落馅饼数,之后类似于数塔问题,选择不同路径向下搜索,最终求出最值。
感想:挺有意思的问题,不知道还有没有更好的解法。
代码:
<span style="font-size:14px;color:#333399;">#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#define maxn 210
using namespace std;
int dp[100010][15],n;
int main()
{
while(scanf("%d", &n) && n)
{
memset(dp, 0, sizeof(dp));
int maxt = 0;
while(n--)
{
int x,t;
scanf("%d%d",&x,&t);
dp[t][x+1]++;
maxt = max(t, maxt);
}
for(int i = maxt-1; 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]));
}
printf("%d\n",dp[0][6]);
}
return 0;
}</span>