牛客网华为机试题动态规划最长递增子序列(一维)Redraiment的走法

文章提供了一个使用Java解决寻找梅花桩上最多步数的问题,通过动态规划算法计算每个位置能到达的最大步数,最终找到最大步数。

视频 https://www.bilibili.com/video/BV1DR4y1B71n/?vd_source=4f066b91c37a21ffbd2cb88e942b561d

Redraiment是走梅花桩的高手。Redraiment可以选择任意一个起点,从前到后,但只能从低处往高处的桩子走。他希望走的步数最多,你能替Redraiment研究他最多走的步数吗?

数据范围:每组数据长度满足 1≤�≤200 1≤n≤200 , 数据大小满足 1≤���≤350 1≤val≤350

输入描述:

数据共2行,第1行先输入数组的个数,第2行再输入梅花桩的高度

输出描述:

输出一个结果

示例1

输入:

6

2 5 1 5 4 5

复制

输出:

3

复制

说明:

6个点的高度各为 2 5 1 5 4 5

如从第1格开始走,最多为3步, 2 4 5 ,下标分别是 1 5 6

从第2格开始走,最多只有1步,5

而从第3格开始走最多有3步,1 4 5, 下标分别是 3 5 6

从第5格开始走最多有2步,4 5, 下标分别是 5 6

所以这个结果是3。



import java.util.Arrays;
import java.util.Scanner;

public class Main动态规划最长递增子序列 {


    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        String line = scanner.nextLine();
        String line2 = scanner.nextLine();
        String[] s = line2.split(" ");
        int[] num = new int[s.length];

        for (int i = 0; i < s.length; i++) {
            num[i] = Integer.parseInt(s[i]);
        }
        int[] dp = new int[num.length];

//        num 2 5 1 5 4 5
        for (int i = 0; i < num.length; i++) {
            dp[i] = 1;
            //i 控制引入元素,引入 1个 2个 3个  4个 .....

            for (int j = i - 1; j >= 0; j--) {
//                内层循环 和前面i-1个元素逐个比较
                if (num[i] > num[j]) {
//                   更新dp值
                    dp[i] = Math.max(dp[i], dp[j] + 1);

                }

            }

        }
        int max = -1;
        for (int i = 0; i < num.length; i++) {
            if (dp[i] > max) {
                max = dp[i];
            }

        }
        System.out.println(max);

//动态规划思路  一点点算 慢慢迭代,求大的要先算小的,俄罗斯套娃那种
//        6
//        2 5 1 5 4 5
//        0 1 2 3 4 5
//        dp[i] 表示以i为结尾的最长子序列的长度


//      当只有一个元素  [2]
//                  dp[0]=1


//      加入元素5 ,[2,5]
//      dp[0]=1  ,d[1]=d[0]+1=2  5比2大,所以可以在2的基础上加


//      加入元素1 ,[2,5,1]
//      dp[0]=1  ,d[1]=2   d[2]=1

//      加入元素5 ,[2,5,1,5]
//      dp[0]=1  ,d[1]=2   d[2]=1, d[3]=max{d[0]+1,d[2]+1}=2

//      加入元素4 ,[2,5,1,5,4]
//      dp[0]=1  ,d[1]=2   d[2]=1, d[3]=2, d[4]=max{d[0]+1,d[2]+1}=2

//      加入元素5 ,[2,5,1,5,4,5]
//      dp[0]=1  ,d[1]=2   d[2]=1, d[3]=2, d[4]=2,d[5]=max{d[0]+1,d[2]+1,d[4]+1}=3
//        dp[0]=1  ,d[1]=2   d[2]=1, d[3]=2, d[4]=2,d[5]=3






    }


}





评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值