题解 | #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); } } }