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;
}