题目
给定一个长度为 的数列,求数值严格单调递增的子序列的长度最长是多少。
输入格式
第一行包含整数 。
第二行包含 个整数,表示完整序列。
输出格式
输出一个整数,表示最大长度。
数据范围
,
输入样例:
7
3 1 2 1 8 5 6
输出样例:
4
解题
方法一:动态规划
思路
思维过程:
动态规划:
- 状态定义: 表示所有以数组中第 个数结尾的上升子序列的最大长度。
- 状态转移方程:当 时, 。
- 初始状态: 。
代码
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
in.nextToken();
int n = (int) in.nval;
int[] a = new int[n];
for (int i = 0; i < n; ++i) {
in.nextToken();
a[i] = (int) in.nval;
}
int[] dp = new int[n];
for (int i = 0; i < n; ++i) {
dp[i] = 1;
for (int j = 0; j < i; ++j) {
if (a[j] < a[i]) dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
int max = 1;
for (int x : dp) max = Math.max(max, x);
System.out.println(max);
}
}
#include <iostream>
using namespace std;
const int N = 1010;
int n;
int a[N], dp[N];
int main() {
scanf("%d", &n);
for (int i = 0; i < n; ++i) scanf("%d", &a[i]);
for (int i = 0; i < n; ++i) {
dp[i] = 1;
for (int j = 0; j < i; ++j) {
if (a[j] < a[i]) dp[i] = max(dp[i], dp[j] + 1);
}
}
int mx = 0;
for (int& x : dp) mx = max(mx, x);
printf("%d\n", mx);
return 0;
}
评论区