给一串数据
I | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
num[I] | 1 | 4 | 7 | 2 | 5 | 8 | 3 | 6 | 9 |
来得到其对应位上的数据的最长有序子序列的长度L;
I | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
num[i] | 1 | 4 | 7 | 2 | 5 | 8 | 3 | 6 | 9 |
F[i] | 1 | 2 | 3 | 2 | 3 | 4 | 3 | 4 | 5 |
这是个经典的DP问题。
在这里我们利用F[i]的数组;
来储存其之前数据的最长有序子序列
进而得到后面的。
/*最长有序子序列*/
#include<iostream>
using namespace std;
int main()
{
int num[]={1,4,7,2,5,8,3,6,9};
int F[9];
for(int i=0;i<=8;i++)
{
F[i]=1;//全都置为1,本身也是最长有序子序列的一个元素
}
for(int i=0;i<=8;i++)
{
cout<<F[i]<<" ";
}
cout<<endl;
for(int i=0;i<=8;i++)
{
for(int j=0;j<i;j++)
{
if(num[j]<num[i])
if(F[i]<F[j]+1)//当元素小于前面较之小元素的+1值才进行更新。
{
F[i]=F[j]+1;
}
}
}
for(int i=0;i<=8;i++)
{
cout<<F[i]<<" ";
}
return 0;
}
刚开始写成了
if(num[j]<num[i])
<span style="white-space:pre"> </span>F[i]=F[j]+1;
后来发现这样只计算了对应位置前面小于该值的数目。并没有计算出最长有序子序列。
因此当F[i]小于F[j]+1后才进行更新能保留住前面的最长有序子序列的值。