动态规划五部曲:
1、确定dp数组及其下标的含义
dp[i]:dp[i]表示i之前包括i的最长上升子序列。 就是nums[i]需要在该上升序列中
2、确定递推式
递推公式 dp[i]可由dp[j]推出 j<i
当后者比前者大 nums[i]>nums[j]时 dp[i] = max(dp[i],dp[j]+1);
3、初始化
dp[i] = 1;
4、遍历顺序
从前到后
5、举例dp数组
[1,3,6,7,9,4,10,5,6]
dp数组变化:每一行是dp[i]的变化值
2
2 3
2 3 4
2 3 4 5
2 3 3 3 3
2 3 4 5 6 6
2 3 3 3 3 4 4
2 3 3 3 3 4 4 5
题解:
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
//最长递增子序列
//dp[i]:dp[i]表示i之前包括i的最长上升子序列。 就是nums[i]需要在该上升序列中
//递推公式 dp[i]可由dp[j]推出 j<i
//当后者比前者大 nums[i]>nums[j]时 dp[i] = max(dp[i],dp[j]+1);
if(nums.size() == 1){
return 1;
}
//定义dp数组 初始化
vector<int> dp(nums.size(),1);
//结果
int maxLen = 0;
//计算dp数组
for(int i = 1;i<nums.size();i++){
for(int j = 0;j<i;j++){
if(nums[i]>nums[j]){
dp[i] = max(dp[i],dp[j]+1);
}
}
if(dp[i]>maxLen){
//取最大
maxLen = dp[i];
}
}
return maxLen;
}
};