题解 | #Redraiment的走法#
Redraiment的走法
http://www.nowcoder.com/practice/24e6243b9f0446b081b1d6d32f2aa3aa
java 动态规划 自己写了注释
import java.util.*;
public class Main{
/**
最大升序子串长度 问题 动态规划
*/
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int count = sc.nextInt();
int[] a = new int[count];
for(int i=0;i<count;i++){
a[i] = sc.nextInt();
}
int[] dp = new int[count];//dp[i] 表示下标以i结尾的数组的最大升序子串长度(也就是本题的桩数)
//dp[i] 有两种来路: 1、前面的一些组合,a[j] < a[i],i 正好可以接上 2、i本身
for(int i=0;i<dp.length;i++){
dp[i] = 1;//以 i 为终点的最大升序子串 至少为1 即i本身
for(int j=0;j<=i-1;j++){//遍历 i 前面的数
if(a[j] < a[i]){
//如果前面的 j 小于 i 说明又可以延长组成升序子串 dp[j]+1
//还需要和dp[i]比较一下,选一个大的数
dp[i] = Math.max(dp[i],dp[j]+1);
}
}
}
//起点并不重要,只关注于终点,每个数都作为终点,也等价于所有的起点情况,只要找出其中的最大值即可
int max = 0;
for(int i=0;i<dp.length;i++){
if(max < dp[i]){
max = dp[i];
}
}
System.out.println(max);
}
}
}