问题描述:
给定一个无序的数组,找到最长递增子序列的长度。
解题思路:
将LIS问题转化为dag上的最长路问题。用dp[j]表示以第j个数结尾的最长递增子数列的长度。
转化方式:将每个数作为一个结点. 从结点u到结点v连一条边,当且仅当u代表的数在原数列中出现在v代表的数前面,而且u代表的数比v代表的数小.
状态转移方程如下:
if(从i到j存在一条边)
dp[j]=1+max(dp[i]);
源代码如下:
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int size=nums.size();
if(size==0) return 0;
int dp[size];
for(int i=0;i<size;i++) dp[i]=1;
for(int j=1;j<size;j++)
{
for(int i=0;i<j;i++)
{
if(nums[i]<nums[j])
{
if(dp[j]<dp[i]+1) dp[j]=dp[i]+1;
}
}
}
int max=dp[0];
for(int i=0;i<size;i++)
{
if(max<dp[i]) max=dp[i];
}
return max;
}
};