給定一整型數列{a1,a2...,an}(n>0),求最大的非降子序列的長度。
如:1 9 10 5 11 2 13的最長非降子序列是1 9 10 11 13,長度爲5。
狀態轉移方程 dp【i】=max(dp【j】+1) ( j < i 且a [ i ] > =a[ j ])
用大白話解釋就是: 想要求dp[i],就把i前面的各個子序列中,最後一個數不大於a[i]的序列長度+1,然後取出最大的長度即爲dp[i];
求出各個子序列長度dp[i]後,最終的結果就是dp數組中最大的值.
#include<iostream>
#include<vector>
int lis(std::vector<int>& vec)
{
//res保存所有的狀態,
//res[i]表示以vec[i]爲結尾的子序列長度
//初始化爲1
std::vector<int> res(vec.size(),1);
//length保存最大的長度
int length=0;
for(int i=0; i< vec.size(); ++i)
{
for(int j=0; j<i; ++j)
{
if(vec[i] >= vec[j])
//狀態轉移方程
res[i]= std::max(res[j]+1,res[i]);
}
if(res[i] > length)
length = res[i];
}
//打印所有的狀態
for(int n=0 ; n< res.size() ; ++n)
std::cout <<n <<" : " << res[n] << std::endl;
//返回最大長度
return length;
}
int main()
{
int arr[]={5,3,3,4,8,6,7,9,4,2};
std::vector<int> vec( arr , arr+sizeof(arr)/sizeof(int) );
std::cout << "lis's length is :" << lis(vec) << std::endl;
return 0;
}