import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int m = scanner.nextInt(); scanner.nextLine(); char[][] grid = new char[n][m]; for (int i = 0; i < n; i++) { String line = scanner.nextLine().trim(); grid[i] = line.toCharArray(); } int[][] scores = new int[n][m]; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { char c = grid[i][j]; switch (c) { case 'l': scores[i][j] = 4; break; case 'o': scores[i][j] = 3; break; case 'v': scores[i][j] = 2; break; case 'e': scores[i][j] = 1; break; default: scores[i][j] = 0; break; } } } int[][] dp = new int[n][m]; dp[0][0] = scores[0][0]; for (int j = 1; j < m; j++) { dp[0][j] = dp[0][j - 1] + scores[0][j]; } for (int i = 1; i < n; i++) { dp[i][0] = dp[i - 1][0] + scores[i][0]; } for (int i = 1; i < n; i++) { for (int j = 1; j < m; j++) { dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + scores[i][j]; } } System.out.println(dp[n - 1][m - 1]); } }
https://www.nowcoder.com/discuss/727521113110073344
思路:
- 输入处理:读取矩阵的行列数和每个格子的字符。
- 得分预处理:将每个字符转换为对应的得分,存储在一个二维数组中。
- 动态规划数组初始化:处理左上角、第一行和第一列的得分。
- 动态规划填充:根据状态转移方程填充其余位置的得分。
- 结果输出:输出右下角的最大得分。