前言
本博客仅做学习笔记,如有侵权,联系后即刻更改
科普:
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
总结
小小励志
有些事你现在不做,一辈子都不会做了。
如果你想做一件事,全世界都会为你让路。
《搭车去柏林》