HDU - 1176 免费馅饼(数塔类型DP)

题目链接:


大致题意:

在0到10的坐标上,会掉落n个馅饼,给出馅饼掉落的位置和时间,主人公一次只能接到他所在位置即左右三个位置上掉落的馅饼,求主人公最多可以接到多少馅饼(初始在5这个位置)


解题思路:

数她 逆着dp


AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 15, M = 1e5 + 10;

int n;
int w[N][M];  //在i的位置第j时间掉落的馅饼数
int f[N][M];  //在i的位置第j时间接到的最多馅饼数

int main() {
          
   
	while (cin >> n, n) {
          
   
		memset(w, 0, sizeof w);
		memset(f, 0, sizeof f);
		int x, t, maxt = 0;
		for (int i = 0; i < n; ++i) {
          
   
			scanf("%d%d", &x, &t);
			//cin >> x >> t;
			w[x][t]++;
			maxt = max(maxt, t);
		}

		for (int i = 0; i < N; ++i)f[i][maxt] = w[i][maxt];  //初始化
		for (int j = maxt - 1; j >= 0; --j)
			for (int i = 0; i <= 10; ++i)
				f[i][j] = max(f[i - 1][j + 1], max(f[i][j + 1], f[i + 1][j + 1])) + w[i][j];

		cout << f[5][0] << endl;
	}
	return 0;
}

END

经验分享 程序员 微信小程序 职场和发展