Files
python/TangDou/CSP-J/AcWingTraining/T7/4731.cpp

71 lines
2.3 KiB
C++
Raw Normal View History

2025-08-30 18:35:01 +08:00
#include <bits/stdc++.h>
using namespace std;
const int N = 510;
const int M = 110;
struct Node {
int x, y;
/*
Q1:ΪʲôҪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
A:<EFBFBD><EFBFBD>ΪҪDP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޺<EFBFBD>Ч<EFBFBD>ԡ<EFBFBD>Ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ң<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٱ<EFBFBD><EFBFBD>޸ģ<EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ˳<EFBFBD><EFBFBD>
Q2:<EFBFBD><EFBFBD>ʲô<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
A:<EFBFBD><EFBFBD><EFBFBD>԰<EFBFBD>x+y<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><EFBFBD><EFBFBD>԰<EFBFBD><EFBFBD><EFBFBD>x,<EFBFBD><EFBFBD>y<EFBFBD>ķ<EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򣬶<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ġ<EFBFBD>
1.<EFBFBD><EFBFBD>x+y<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const bool operator<(const Node &t) {
return x + y < t.x + t.y;
}
*/
// 2.<2E>Ȱ<EFBFBD>x,<2C>ٰ<EFBFBD>y<EFBFBD><79><EFBFBD><EFBFBD>
const bool operator<(const Node &t) {
if (x == t.x) return y < t.y;
return x < t.x;
}
} a[N];
int f[N][M];
int ans;
int main() {
// <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
// freopen("point.in", "r", stdin);
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; ++i) cin >> a[i].x >> a[i].y;
sort(a + 1, a + 1 + n);
// dp<64><70>ʼ<EFBFBD><CABC>,<2C><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>i<EFBFBD>ŵ<EFBFBD>ѡ<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD>,ʹ<><CAB9><EFBFBD><EFBFBD>j<EFBFBD><6A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EEB3A4><EFBFBD>г<EFBFBD><D0B3><EFBFBD>
for (int i = 1; i <= n; i++)
for (int j = 0; j <= m; j++)
f[i][j] = j + 1; // <20><>i<EFBFBD><69><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ң<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>j<EFBFBD><6A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㣬<EFBFBD><E3A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Թ<EFBFBD><D4B9><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EEB3A4><EFBFBD><EFBFBD>Ϊj+1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ״̬ת<CCAC><D7AA>
for (int i = 1; i <= n; i++) // ö<><C3B6>ÿ<EFBFBD><C3BF>ԭʼ<D4AD><CABC>
for (int j = 1; j < i; j++) { // ö<><C3B6>ÿ<EFBFBD><C3BF>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
if (a[i].x < a[j].x || a[i].y < a[j].y) continue; // <20><><EFBFBD><EFBFBD>j<EFBFBD><6A><EFBFBD><EFBFBD>i<EFBFBD><69><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD>Чת<D0A7><D7AA>
int d = a[i].x - a[j].x + a[i].y - a[j].y - 1; // j->i <20><>Ҫ<EFBFBD><D2AA><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/*
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>j<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Щ<EFBFBD><EFBFBD>״̬ <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD>Ƶ<EFBFBD> i<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Щ<EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD>
˼<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>f[j]<EFBFBD>Ķ<EFBFBD>ά״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Сֵ<EFBFBD><EFBFBD>0,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>m
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>f[j]<EFBFBD>Ķ<EFBFBD>ά״̬<EFBFBD>仯<EFBFBD><EFBFBD><EFBFBD>ǹ̶<EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD>d
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫö<EFBFBD><EFBFBD>j<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD>ƵĶ<EFBFBD>ά״ֵ̬<EFBFBD><EFBFBD>0 ~ m-d
*/
for (int k = 0; k <= m - d; k++) {
// f[j][k]<5D><>ǰ<EFBFBD><C7B0>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>+dת<64>Ƶ<EFBFBD><C6B5>µ<EFBFBD>״̬
// f[j][k+d]+d+1 -> f[i][k+d]
f[i][k + d] = max(f[i][k + d], f[j][k] + d + 1);
// <20><>״̬ת<CCAC><D7AA><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD><EFBFBD>ռ<EFBFBD>һ<EFBFBD>´<EFBFBD><C2B4><EFBFBD>
// С<><D0A1>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>m<EFBFBD><6D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㣬<EFBFBD><E3A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>˵Ļ<CBB5><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˷ѣ<CBB7><D1A3><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>룬
// <20>Ѷ<EFBFBD><D1B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD>
ans = max(ans, f[i][k + d] + m - k - d); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB3A4><EFBFBD><EFBFBD>
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
printf("%d\n", ans);
return 0;
}