71 lines
2.3 KiB
C++
71 lines
2.3 KiB
C++
|
|
#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;
|
|||
|
|
}
|