视频 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
}
}
文章提供了一个使用Java解决寻找梅花桩上最多步数的问题,通过动态规划算法计算每个位置能到达的最大步数,最终找到最大步数。
445

被折叠的 条评论
为什么被折叠?



