当前位置:   article > 正文

【蓝桥杯3543】松散子序列(dp动态规划&java)

松散子序列

问题描述

答案提交

解题思路

 这位老哥写的分析非常好,推导过程也很清晰,我也标注了一些辅助标记。

图源

AC代码

  1. import java.util.Scanner;
  2. public class Main {
  3. public static void main(String[] args) {
  4. // 创建Scanner对象,用于接收用户输入
  5. Scanner scan = new Scanner(System.in);
  6. // 将用户输入的字符串转换为字符数组
  7. char[] str = scan.next().toCharArray();
  8. // 获取输入字符串的长度
  9. int len = str.length;
  10. // 创建数组用于存储计算结果,长度为输入字符串长度加3
  11. int[] dp = new int[len + 3];
  12. // 将字符数组中的字符转换为对应的数字,存储在dp数组中
  13. for (int i = 0; i < len; i++) {
  14. dp[i] = str[i] - 'a' + 1;
  15. }
  16. // 将数组整体右移三位,左三位补0
  17. for (int i = len + 2; i >= 0; i--) {
  18. if (i < 3) {
  19. dp[i] = 0;
  20. continue;
  21. }
  22. dp[i] = dp[i - 3];
  23. }
  24. // 从第四个位置开始,每个位置的值等于前两个和前三个位置中的较大值加上原始值
  25. for (int i = 3; i < len + 3; i++) {
  26. dp[i] += Math.max(dp[i - 2], dp[i - 3]);
  27. }
  28. // 这是因为子序列的最后一个字符可能是原序列的倒数第一个或倒数第二个
  29. int finals = Math.max(dp[len + 1], dp[len + 2]);
  30. // 打印最终结果
  31. System.out.println(finals);
  32. }
  33. }

相关知识 

动态规划,找表达式。

(by 归忆)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/64243
推荐阅读
相关标签
  

闽ICP备14008679号