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


全部评论

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务