题目链接

最长递增子序列

题目描述

image.png

实现代码

动态规划思想:记dp[i]表示数组nums的前i个数组成的子数组的最长递增子序列长度,因此有状态转移方程:

dp[i] = max(dp[x] + (nums[i] > nums[x] ? 1 : 0) ), 0 < x < i

可以看看官方题解给的动图:动图链接

实现代码:

  1. class Solution {
  2. public int lengthOfLIS(int[] nums) {
  3. if (nums.length == 0) {
  4. return 0;
  5. }
  6. int[] dp = new int[nums.length];
  7. dp[0] = 1;
  8. int maxans = 1;
  9. for (int i = 1; i < nums.length; i++) {
  10. dp[i] = 1;
  11. for (int j = 0; j < i; j++) {
  12. if (nums[i] > nums[j]) {
  13. dp[i] = Math.max(dp[i], dp[j] + 1);
  14. }
  15. }
  16. maxans = Math.max(maxans, dp[i]);
  17. }
  18. return maxans;
  19. }
  20. }