题目:点击打开链接
都说这个题可以转化为数字三角形来做,但是为什么呢,我个人的理解是因为下一秒钟只能接左右距离1米以内的馅饼,这就像数字三角形每次只能在下一行对应的两个位置中选择,所以设置一个数组dp[i][j], i表示时间, j表示位置,dp[i][j]表示i时刻j位置能接到的馅饼的数目, 这样就可以转化为数字三角形。如果存在一些不可能接到馅饼的情况,比如9, 2,因为最后的得数是dp[0][5]这个位置的值,可以知道dp[2][9]这个位置的值对dp[0][5]是没有影响的,也就自动的排除掉了。
#include <stdio.h>
#include <string.h>
int dp[100100][100];
//dp[i][j]表示第秒在位置j能获得的最多个数
int max1 (int x, int y, int z)
{
int max = x;
if(y > max)
max = y;
if(z > max)
max = z;
return max;
}
int main (void)
{
int n;
while(scanf("%d", &n) && n)
{
memset(dp, 0, sizeof(dp));
int x, y, i, j;
int max = 0;
for(i = 0; i < n; i++)
{
scanf("%d %d", &x, &y);
dp[y][x]++;
if(y > max)
max = y;
}
for(i = max - 1; i >= 0; i--)
for(j = 0; j <= 10; j++)
dp[i][j] += max1(dp[i + 1][j], dp[i + 1][j - 1], dp[i + 1][j + 1]);
printf("%d\n", dp[0][5]);
}
return 0;
}