总的来说,这是一道挺有特点的基础DP,上升子序列+路径回溯 // // Created by SANZONG on 2020/10/23. // #include "stdio.h" #include "iostream" #include "algorithm" #include "vector" using namespace std; struct mouse{ int num; int w; int s; }m[1001]; int dp[1001]; bool cmp(mouse a,mouse b) { if(a.w == b.w) { return a.s > b.s; } return a.w < b.w; } int pre[10010]; int main() { int k = 0; while (scanf("%d%d",&m[k].w,&m[k].s)!=EOF) { m[k].num = k+1; dp[k] = 1; pre[k] = -1; k++; } sort(m,m+k,cmp); // for(int i = 0;i < k;i++) // cout << m[i].w << ' ' << m[i].s << endl; int mxi ; int ma = 0; for(int i = 0;i < k;i++ ) //针对每一个i得出这个i最长的情况 { for(int j = 0;j < i;j++) { if(m[j].s > m[i].s && m[j].w < m[i].w && dp[i] < dp[j]+1) { dp[i] = dp[j]+1; pre[i] = j; //记录路径 if(ma < dp[i]) { ma = dp[i]; mxi = i; //读入的最后一个位置 } } } } cout << ma << endl; vector<int> v; while (mxi != -1) { // cout << m[mxi].num << endl; v.push_back(mxi); mxi = pre[mxi]; } for(int i = v.size()-1;i >= 0;i--) cout << m[v[i]].num << endl; }