杭电OJ 1176(C++)

基础动态规划题。设 dp[i][j] 表示从 i 时刻 j 位置开始,最终能接到的最大馅饼数。

dp[i][j] = max(dp[i + 1][j + 1], dp[i + 1][j], dp[i + 1][j - 1]) + 原本的dp[i][j]

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 100005;

int dp[MAXN][12]; //dp[i][j]表示从i时刻j位置开始,最终能接到的最大馅饼数

int main()
{
	int n, x, t;
	while (scanf("%d", &n) != EOF)
	{
		if (n == 0)
			break;
		memset(dp, 0, sizeof(dp));
		int maxT = 0;
		for (int i = 0; i < n; i++)
		{
			scanf("%d%d", &x, &t);
			dp[t][x]++;
			if (t > maxT)
				maxT = t;
		}
		for (int i = maxT - 1; i >= 0; i--)
		{
			for (int j = 0; j <= 10; j++)
				dp[i][j] += max(dp[i + 1][j + 1], max(dp[i + 1][j], dp[i + 1][j - 1]));	
		}
		printf("%d\n", dp[0][5]);
	}
	return 0;
}

继续加油。

发布了138 篇原创文章 · 获赞 1 · 访问量 7024

猜你喜欢

转载自blog.csdn.net/Intelligence1028/article/details/104560974