题目要求:http://acm.hdu.edu.cn/showproblem.php?pid=1160
思路: 运用结构体,对两个分别排序
#include <iostream>
#include<string.h>
using namespace std;
//int a[10] = {6,5,4,2,9,1,5,12,3,2};
int f[1002];
int l[1002];//表示路径。
int e = 0;
struct M
{
int w,s,l;
}mouse[1002];
void printl(int e,M a[])//用于打印路径
{
if(l[e] != -1)
printl(l[e],a);
cout<<a[e].l+1<<endl;
}
int LC(M a[],int N) //找最长递减子序列。
{
int i;
memset(l,-1,sizeof(l)); //memset 只能初始化0 和-1.
memset(f,0,sizeof(f));
f[0] = 1;
int max = f[0];
for(i = 1; i<N; i++)
{
for(int j = 0; j<i; j++)
if(a[i].s < a[j].s && f[i]<f[j])//a[j]<a[i]:递增子序列;a[j]<=a[i]不减子序列
{ //a[j]>a[i]:递减子序列;a[j]>=a[i]不增子序列
f[i] = f[j];
l[i] = j;
}
f[i] ++; //将自身加上。
if(max<f[i])
{
max = f[i];
e = i; //现在路径的end 位置。
}
}
cout<<max<<endl;
printl(e,a);
return 0;
}
void quicksort(M a[],int n)
{
for(int i = 1; i<= n-1; i++)
{
int k = i-1;
for(int j = i; j<n; j++)
if(a[j].w<a[k].w)
k = j;
if(k != (i-1))
{
swap(a[i-1].w,a[k].w);
swap(a[i-1].s,a[k].s);
swap(a[i-1].l,a[k].l);
}
}
}
int main()
{
int i = 0;
while(cin>>mouse[i].w >>mouse[i].s)
{
mouse[i].l = i;
i++;
}
quicksort(mouse,i);
LC(mouse,i);
return 0;
}