题目较为简单,但是我一开始做输出的时候,为了达到先找到头结点在向后输出采用了stack
但是后来改进的递归输出的确更加的高明。
#include <iostream>
#include <algorithm>
using namespace std;
#define size 1010
int dp[size]; //存储值
int pre[size];
struct mouse{
int index, weight, speed;
}a[size];
bool cmp(mouse a,mouse b)
{
if(a.weight == b.weight)
return a.speed > b.speed;
return a.weight < b.weight;
}
void output(int i){
if(pre[i] == 0){
cout<<a[i].index<<endl;
return;
}
output(pre[i]);
cout<<a[i].index<<endl;
}
int main(){
freopen("in.txt", "r", stdin);
int i, j, num_mouse = 1, Max_i = 0, Max = 0; //Max_i为最大上升子序列最后一个节点的位置,Max表示获得的最大个数
while(cin>>a[num_mouse].weight>>a[num_mouse].speed){
a[num_mouse].index = num_mouse;
num_mouse++;
}
sort(a + 1, a + num_mouse, cmp);
dp[1] = 1;
for(i = 2; i < num_mouse; i++){
dp[i] = 1;
for(j = 1; j < i; j++){
if(a[i].weight > a[j].weight && a[i].speed < a[j].speed && dp[j] + 1 > dp[i]){
dp[i] = dp[j] + 1;
pre[i] = j; //i的前驱为j,主要用于输出
if(dp[i] > Max){ //让Max保持的是最大个数
Max = dp[i];
Max_i = i; //Max_i最大个数的结尾位置
}
}
}
}
cout<<Max<<endl;
output(Max_i);
return 0;
}