AcWing-895.最长上升子序列
题目描述
给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。
输入格式
第一行包含整数 N。
第二行包含 N 个整数,表示完整序列。
输出格式
输出一个整数,表示最大长度。
数据范围
1≤N≤1000,
−109≤数列中的数≤109
输入样例:
7
3 1 2 1 8 5 6
输出样例:
4
思路
状态表示f(i):
集
合
:
表
示
以
第
i
个
数
为
结
尾
的
所
有
子
序
列
集合:表示以第i个数为结尾的所有子序列
集合:表示以第i个数为结尾的所有子序列
属 性 : M a x ( 最 长 ) 属性:Max(最长) 属性:Max(最长)
核心:
以
第
i
个
数
为
结
尾
的
子
序
列
的
最
大
值
等
于
以
1
到
i
−
1
为
结
尾
的
子
序
列
的
最
大
值
或
者
为
其
最
大
值
+
1
以第i个数为结尾的子序列的最大值等于以1到i-1为结尾的子序列的最大值或者为其最大值+1
以第i个数为结尾的子序列的最大值等于以1到i−1为结尾的子序列的最大值或者为其最大值+1
状态转换:
f
(
i
)
=
f
(
j
)
+
1
当
a
(
i
)
>
a
(
j
)
时
成
立
f(i) = f(j)+1~~~~当a(i)>a(j)时成立
f(i)=f(j)+1 当a(i)>a(j)时成立
f ( i ) = f ( j ) 当 a ( i ) < = a ( j ) 时 成 立 ~~~f(i) = f(j)~~~~~~~~~~当a(i)<=a(j)时成立 f(i)=f(j) 当a(i)<=a(j)时成立
核心代码
for(int i=1;i<=n;i++) {
f[i] = 1;
for(int j=1;j<i;j++) {
if(a[i]>a[j]) {
f[i] = Math.max(f[i], f[j] + 1);
}
}
}
完整代码
package acWing895;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
public class Main {
static int N = 1010;
static int a[] = new int[N],f[] = new int[N];
public static void main(String[] args) throws Exception{
Read r = new Read();
int n = r.nextInt();
for(int i=1;i<=n;i++) {
a[i] = r.nextInt();
}
int max = 1;
for(int i=1;i<=n;i++) {
f[i] = 1;
for(int j=1;j<i;j++) {
if(a[i]>a[j]) {
f[i] = Math.max(f[i], f[j] + 1);
}
}
max = Math.max(max, f[i]);
}
System.out.println(max);
}
}
class Read{
StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
public int nextInt() throws Exception{
st.nextToken();
return (int)st.nval;
}
}