解题思路

  1. 问题分析:

    • 只能向右或向下移动,是典型的路径DP问题
    • 每个字母有固定的分值:l=4, o=3, v=2, e=1
    • 需要找到得分最高的路径
  2. 动态规划设计:

    • 状态定义: 表示从起点到达位置的最大得分
    • 状态转移:
    • 边界条件:第一行和第一列只能从一个方向到达
  3. 实现要点:

    • 预处理字母得分
    • 注意边界条件处理
    • 最终答案为

代码

#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()

算法及复杂度

  • 算法:动态规划
  • 时间复杂度:,其中 是矩阵的行数和列数
  • 空间复杂度:,用于存储 数组