动态规划-最长递增子序列


前言

本博客仅做学习笔记,如有侵权,联系后即刻更改

科普:


Java实现

递归方程:

  • 时间/空间复杂度:
    使用动态规划求解最长递增子序列问题的时间复杂度为T(n)=O(n2),空间复杂度为S(n)=O(n)

1.Java例题

  • 题目描述
    刚考完研的TC同学这段时间在家闲得慌,因此他决定学点新手艺。今天他学习的内容是:做蛋卷。
    由于是第一次做蛋卷,TC同学做出来蛋卷长短不一。看着这些长度都不一样的蛋卷,TC同学的强迫症又犯了。他希望能够拿出其中部分蛋卷,使得留下来的蛋卷能够按照长度从大到小的次序排列。
    请问他最少需要拿出多少根蛋卷?

  • 输入
    单组输入,对于每一组测试数据,第1行N表示蛋卷的总数量(n<=1000)。
    第2行包含N个正整数,分别表示每一根蛋卷的长度。(单位:厘米)
    保证在同一组输入数据中每一根蛋卷的长度均不一样。

  • 输出
    输出最少需要拿出的蛋卷数量。

  • 代码如下:

package oj16;

import java.util.Scanner;

public class g16 {

  static int sum = 0;
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);

    while (scanner.hasNext()){
      int n = scanner.nextInt();
      int []arr = new int[n];
      for (int i = n-1; i >= 0; i--) {
          arr[i] = scanner.nextInt();
      }

      int []array = new int[n];
      for (int i = 0; i < arr.length; i++)
        array[i] = 1;
      solve(arr,array);
      for (int i=0; i < arr.length; i++)
        if (array[i] > sum)
          sum = array[i];
      System.out.println(n-sum);
      sum = 0;
    }
  }

  static public void solve(int []arr, int []array){
    int maxLen;
    for (int i = 1; i < arr.length; i++) {
      maxLen = 0;
        for (int j = i-1; j >= 0; j--) {
            if (arr[j]<arr[i] && array[j]>maxLen){
              maxLen = array[j];
            }
        }
        array[i] = maxLen+1;
    }
  }
}

2.代码运行示例:

  • 样例输入
    5
    15 18 17 11 12
  • 样例输出
    2

总结

小小励志

有些事你现在不做,一辈子都不会做了。
如果你想做一件事,全世界都会为你让路。
《搭车去柏林》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值