思路:
- LIS变种,输出路径,故使用三角形动归比较方便。
- 坑不少,还是做出来了。合并成一句话:因为是倒序输出,想要先输出 w 小(v 大)的;因此要把 w 小的放后边,因此要在 sort 时把 w 小的放后边
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1005;
struct NODE{
int id;
int w;
int v;
friend bool operator < (NODE a , NODE b)
{
if(a.w == b.w)
return a.v < b.v;
return a.w > b.w;
}
}node[maxn];int cnt = 0;
int dp[maxn];
int ans = 0;
int path[maxn];
int main(){
int l,r;
while(cin>>l>>r){
cnt++;
node[cnt].id = cnt;
node[cnt].w = l;
node[cnt].v = r;
}
sort(node+1 , node+cnt+1);
memset(path , 0 , sizeof(path));
for(int i=1;i<=cnt;i++){
dp[i] = 1;
for(int j=1;j<i;j++)
if(node[i].w < node[j].w && node[i].v > node[j].v)
if(dp[i] < dp[j] + 1){
dp[i] = dp[j] + 1;
path[i] = j;
}
ans = max(ans , dp[i]);
}
cout<<ans<<endl;
int i;
for(i=cnt;i;i--)
if(dp[i] == ans)
break;
while(i){
cout<<node[i].id<<endl;
i = path[i];
}
return 0;
}