原题链接https://codeforces.com/problemset/problem/4/D
题意:给你n个二元组和起始条件,求其最大二维上升子序列,并输出选择编号。
思路:按照一个维度排序,然后DP即可,注意细节。
代码如下
int n, w, h;
struct node{
int w, h, id;
bool operator < (const node &t) const
{
return w < t.w;
}
}ep[N];
int f[N], pre[N];
int main()
{
IOS;
cin >> n >> w >> h;
for(int i = 1 ; i <= n ; i ++)
{
cin >> ep[i].w >> ep[i].h;
ep[i].id = i;
}
sort(ep + 1, ep + n + 1);
for(int i = 1 ; i <= n ; i ++)
{
if(ep[i].w > w && ep[i].h > h) //只有能放卡才有意义
{
f[i] = 1;
pre[i] = i;
for(int j = 1 ; j < i ; j ++)
{
if(ep[i].w > ep[j].w && ep[i].h > ep[j].h && f[i] < f[j] + 1)
f[i] = f[j] + 1, pre[i] = j;
}
}
}
int res = 0, d = 0;
for(int i = 1 ; i <= n ; i ++)
if(res < f[i])
res = f[i], d = i;
cout << res << endl;
if(res)
{
vector<int> v;
int t = pre[d];
v.push_back(ep[d].id);
res --;
while(res --)
{
v.push_back(ep[t].id);
t = pre[t];
}
for(int i = v.size() - 1 ; i >= 0 ; i --)
cout << v[i] << " ";
}
return 0;
}