免费馅饼(nyoj 613)

本文介绍了一道关于馅饼收集的问题,并将其转化为数字三角形问题进行求解。通过使用动态规划的方法,定义了一个二维数组dp[i][j]来记录在第i秒位于j位置时能够接收到的最大馅饼数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:点击打开链接

都说这个题可以转化为数字三角形来做,但是为什么呢,我个人的理解是因为下一秒钟只能接左右距离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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值