问题描述
答案提交
解题思路
这位老哥写的分析非常好,推导过程也很清晰,我也标注了一些辅助标记。
AC代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// 创建Scanner对象,用于接收用户输入
Scanner scan = new Scanner(System.in);
// 将用户输入的字符串转换为字符数组
char[] str = scan.next().toCharArray();
// 获取输入字符串的长度
int len = str.length;
// 创建数组用于存储计算结果,长度为输入字符串长度加3
int[] dp = new int[len + 3];
// 将字符数组中的字符转换为对应的数字,存储在dp数组中
for (int i = 0; i < len; i++) {
dp[i] = str[i] - 'a' + 1;
}
// 将数组整体右移三位,左三位补0
for (int i = len + 2; i >= 0; i--) {
if (i < 3) {
dp[i] = 0;
continue;
}
dp[i] = dp[i - 3];
}
// 从第四个位置开始,每个位置的值等于前两个和前三个位置中的较大值加上原始值
for (int i = 3; i < len + 3; i++) {
dp[i] += Math.max(dp[i - 2], dp[i - 3]);
}
// 这是因为子序列的最后一个字符可能是原序列的倒数第一个或倒数第二个
int finals = Math.max(dp[len + 1], dp[len + 2]);
// 打印最终结果
System.out.println(finals);
}
}
相关知识
动态规划,找表达式。
(by 归忆)