蒟蒻求助
  • 板块学术版
  • 楼主aaaaaaqqqqqq
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/2/13 21:05
  • 上次更新2023/10/24 00:51:47
查看原帖
蒟蒻求助
556940
aaaaaaqqqqqq楼主2023/2/13 21:05

P8816 上升点列

不知道为什么,一直过不了,有几个点总是WA

大体思路就是记忆化搜索

#include <bits/stdc++.h>
using namespace std;
int n, k, ans = INT_MIN;
int memory[510][510];
struct point
{
	int x, y;
} p[510];
bool cmp(point a, point b)
{
	if (a.x == b.x)
	{
		return a.y < b.y;
	}
	return a.x < b.x;
}
int getDistance(point a, point b)
{
	return abs(a.x - b.x) + abs(a.y - b.y) - 1;
}
int dfs(int step, int tmpk)
{
	if (step == n)
	{
		return tmpk + 1;
	}
	int ret = 1;
	int tmpret = 1;
	for (int i = 1; i + step <= n; i++)
	{
		if (p[step].y > p[i + step].y)
		{
			continue;
		}
		int d = getDistance(p[step], p[i + step]);
		if (tmpk < d)
		{
			tmpret = tmpk + 1;
		}
		else
		{
			if (memory[step + i][tmpk - d] == -1)
			{
				memory[step + i][tmpk - d] = dfs(step + i, tmpk - d);
			}
			tmpret += d + memory[step + i][tmpk - d];
		}
		ret = max(ret, tmpret);
		tmpret = 1;
	}
	return ret;
}
int main()
{
	memset(memory, -1, sizeof(memory));
	scanf("%d%d", &n, &k);
	if (n == 0)
	{
		printf("%d", k);
		return 0;
	}
	for (int i = 1; i <= n; i++)
	{
		scanf("%d%d", &p[i].x, &p[i].y);
	}
	sort(p + 1, p + n + 1, cmp);
	for (int i = 1; i <= n; i++)
	{
		ans = max(ans, dfs(i, k));
	}
	if (ans == INT_MIN)
	{
		ans = 0;
	}
	printf("%d", ans);
	return 0;
}
2023/2/13 21:05
加载中...