解题思路
-
问题分析:
- 只能向右或向下移动,是典型的路径DP问题
- 每个字母有固定的分值:l=4, o=3, v=2, e=1
- 需要找到得分最高的路径
-
动态规划设计:
- 状态定义: 表示从起点到达位置的最大得分
- 状态转移:
- 边界条件:第一行和第一列只能从一个方向到达
-
实现要点:
- 预处理字母得分
- 注意边界条件处理
- 最终答案为
代码
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int getScore(char c) {
switch(c) {
case 'l': return 4;
case 'o': return 3;
case 'v': return 2;
case 'e': return 1;
default: return 0;
}
}
int maxPathScore(int n, int m, vector<string>& grid) {
vector<vector<int>> dp(n, vector<int>(m, 0));
// 初始化第一个格子
dp[0][0] = getScore(grid[0][0]);
// 初始化第一行
for(int j = 1; j < m; j++) {
dp[0][j] = dp[0][j-1] + getScore(grid[0][j]);
}
// 初始化第一列
for(int i = 1; i < n; i++) {
dp[i][0] = dp[i-1][0] + getScore(grid[i][0]);
}
// 动态规划填表
for(int i = 1; i < n; i++) {
for(int j = 1; j < m; j++) {
dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + getScore(grid[i][j]);
}
}
return dp[n-1][m-1];
}
int main() {
int n, m;
cin >> n >> m;
vector<string> grid(n);
for(int i = 0; i < n; i++) {
cin >> grid[i];
}
cout << maxPathScore(n, m, grid) << endl;
return 0;
}
import java.util.*;
public class Main {
private static int getScore(char c) {
switch(c) {
case 'l': return 4;
case 'o': return 3;
case 'v': return 2;
case 'e': return 1;
default: return 0;
}
}
public static int maxPathScore(int n, int m, char[][] grid) {
int[][] dp = new int[n][m];
// 初始化第一个格子
dp[0][0] = getScore(grid[0][0]);
// 初始化第一行
for(int j = 1; j < m; j++) {
dp[0][j] = dp[0][j-1] + getScore(grid[0][j]);
}
// 初始化第一列
for(int i = 1; i < n; i++) {
dp[i][0] = dp[i-1][0] + getScore(grid[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]) + getScore(grid[i][j]);
}
}
return dp[n-1][m-1];
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
char[][] grid = new char[n][m];
for(int i = 0; i < n; i++) {
grid[i] = sc.next().toCharArray();
}
System.out.println(maxPathScore(n, m, grid));
sc.close();
}
}
def get_score(c: str) -> int:
scores = {'l': 4, 'o': 3, 'v': 2, 'e': 1}
return scores.get(c, 0)
def max_path_score(n: int, m: int, grid: list) -> int:
# 初始化dp数组
dp = [[0] * m for _ in range(n)]
# 初始化第一个格子
dp[0][0] = get_score(grid[0][0])
# 初始化第一行
for j in range(1, m):
dp[0][j] = dp[0][j-1] + get_score(grid[0][j])
# 初始化第一列
for i in range(1, n):
dp[i][0] = dp[i-1][0] + get_score(grid[i][0])
# 动态规划填表
for i in range(1, n):
for j in range(1, m):
dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + get_score(grid[i][j])
return dp[n-1][m-1]
def main():
n, m = map(int, input().split())
grid = [input() for _ in range(n)]
print(max_path_score(n, m, grid))
if __name__ == "__main__":
main()
算法及复杂度
- 算法:动态规划
- 时间复杂度:,其中 和 是矩阵的行数和列数
- 空间复杂度:,用于存储 数组