O(n^2)算法分析如下:
(a[1]...a[n] 存的都是输入的数)
1、对于a[n]来说,由于它是最后一个数,所以当从a[n]开始查找时,只存在长度为1的不下降子序列;
2、若从a[n-1]开始查找,则存在下面的两种可能性:
(1)若a[n-1] < a[n] 则存在长度为2的不下降子序列 a[n-1],a[n];
(2)若a[n-1] > a[n] 则存在长度为1的不下降子序列 a[n-1]或者a[n]。
3、一般若从a[t]开始,此时最长不下降子序列应该是按下列方法求出的:
在a[t+1],a[t+2],...a[n]中,找出一个比a[t]大的且最长的不下降子序列,作为它的后继。
代码:选美大赛hrb1116
#include<iostream>
using namespace std;
int main()
{
int a[102],d[102],c[102];
int n;
while(cin>>n&&n)
{
int i;
for(i=0; i<n; i++)
{
cin>>a[i];
d[i]=1;
}
int j,max=0,k=0;
for(i=1; i<n; i++)
{
for(j=0; j<i; j++)
{
if(a[i]>a[j]&&d[j]+1>d[i])//因为a[i]>a[j],所以d[i]此时<=d[j]
d[i]=d[j]+1;
}
if(d[i]>max)
max=d[i];
}
cout<<"The number is "<<max<<':';
for(i=n-1;i>=0;i--)
{
if(d[i]==max)
{
max--;
c[k]=i+1;
k++;
}
}
for(i=k-1;i>=0;i--)
cout<<' '<<c[i];
cout<<endl;
}
return 0;
}