该题有两个最长递增子序列组成
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
if (nums[i] > nums[j] && dp[j] + 1 > dp[i]) {
dp[i] = dp[j] + 1;
}
}
}
以上是一个简单的最长子序列程序
我们使用了一个动态规划的方法来解决最长递增子序列的问题。我们定义了一个dp数组,其中dp[i]表示以第i个元素结尾的最长递增子序列的长度。初始时,将dp数组的所有元素初始化为1,因为每个元素本身都可以作为一个递增子序列。
然后,我们通过两层循环遍历数组,对于每个元素,再从第一个元素开始遍历到当前元素,如果当前元素大于前面的元素,并且以前面的元素结尾的递增子序列的长度加1大于以当前元素结尾的递增子序列的长度,则更新dp数组中当前元素的值。
最后,我们遍历整个dp数组,找到其中的最大值,即为最长递增子序列的长度。在示例中,输出的结果为4,表示最长递增子序列的长度为4。
(错误思路)先找到一个最大值,把一个数组分成两个部分,分别进行求解最长递增子序列和最长递增子序列
正确思路
- 创建两个数组,left_dp和right_dp,分别用来记录每个同学左边和右边的最长递增子序列长度。
- 对于每个同学i,从左到右遍历,计算left_dp[i],表示以同学i为最高点时,