动态规划思路:
1、dp[i]意为以nums[i]结尾的数组最大递增子序列长度为dp[i]
2、dp[i]取决于dp[0-i)之间的最大值
3、所以便利从nums[1]开始,且每个元素的初始dp值为1
4、声明一个max找到最大值
int lengthOfLIS(int* nums, int numsSize){
int dp[2500]={0};
int max=0;
for(int i=1;i<numsSize;i++){
for(int j=0;j<i;j++){
if(nums[i]>nums[j])
dp[i]=fmax(dp[i],dp[j]+1);//找到当前项之前小于此值的项的最大dp值加1
}
max=max>dp[i]?max:dp[i];
}
return max+1;//因为开头将所有初始值赋为0,这里返回值加1就行
}
总结:方法很简单,每遍历一个值就回过头去找到小于这个值的值,看看其中最大的那个dp值是多少,当前dp值在次基础上+1就行。所以当前的dp值就等于了从第一个元素到当前元素的最大递增子序列的长度。