import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.next();
        System.out.println(longestPalindromeSubseq(s));
    }
    
    public static int longestPalindromeSubseq(String s) {
        int n = s.length();
        int[][] dp = new int[n][n];
        
        for (int i = n - 1; i >= 0; i--) {
            dp[i][i] = 1;
            for (int j = i + 1; j < n; j++) {
                if (s.charAt(i) == s.charAt(j)) {
                    dp[i][j] = dp[i + 1][j - 1] + 2;
                } else {
                    dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);
                }
            }
        }
        return dp[0][n - 1];
    }
}

https://www.nowcoder.com/discuss/727521113110073344

思路:

输入处理:使用 Scanner 读取输入的字符串。

动态规划数组初始化:二维数组 dp 用于存储子问题的结果,其中 dp[i][i] 初始化为1,因为单个字符本身就是一个回文。

填充动态规划数组:从字符串的末尾开始遍历,确保在计算当前子问题时,所有子子问题已经解决。对于每个字符对 (i, j),根据字符是否相等来更新 dp 数组。

返回结果:最终结果存储在 dp[0][n-1] 中,表示整个字符串的最长回文子序列长度。