比赛 CSP2022普及组 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 上升点列 最终得分 100
用户昵称 HeSn 运行时间 0.051 s
代码语言 C++ 内存使用 2.21 MiB
提交时间 2022-10-29 16:50:14
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
int n, k, xi[510], yi[510], f[510][110], dis[510][510], inc[510], ans;
bool vis[510];
vector<int> cd[510], w[510];
signed main() {
	freopen("csp2022pj_point.in", "r", stdin);
	freopen("csp2022pj_point.out", "w", stdout);
	cin >> n >> k;
	for(int i = 1; i <= n; i ++) {
		cin >> xi[i] >> yi[i];
	}
	for(int i = 1; i <= n; i ++) {
		for(int j = 1; j <= n; j ++) {
			if(i == j) {
				continue;
			}
			int x = abs(xi[i] - xi[j]) + abs(yi[i] - yi[j]) - 1;
			if(xi[i] >= xi[j] && yi[i] >= yi[j]) {
				cd[i].push_back(j);
				w[i].push_back(x);
				inc[j] ++;
			}
			if(xi[i] <= xi[j] && yi[i] <= yi[j]) {
				cd[j].push_back(i);
				w[j].push_back(x);
				inc[i] ++;
			}
		}
	}
	queue<int> q;
	for(int i = 1; i <= n; i ++) {
		if(inc[i] == 0) {
//		cout << i << ' ';
			q.push(i);
		}
	}
	while(!q.empty()) {
		int u = q.front();
		q.pop();
		for(int i = 0; i < cd[u].size(); i ++) {
			int v = cd[u][i];
			inc[v] --;
//			cout << v << ' ';
			if(inc[v] <= 0) {
				q.push(v);
			}
			for(int j = w[u][i]; j <= k; j ++) {
				f[v][j] = max(f[v][j], f[u][j - w[u][i]] + 1);
			}
		}
	}
	for(int i = 1; i <= n; i ++) {
		for(int j = 0; j <= k; j ++) {
			ans = max(ans, f[i][j]);
		}
	}
	cout << ans + k + 1 << endl;
	return 0;
}