使用一个辅助数组sum记录从起点走到当前位置的最大值,即sum.at(i).at(j)表示从(0,0)走到(i,j)的所有路径中的最大值。最后返回sum.at(n-1).at(m-1)即为走完整个矩阵的最大值。

由于遍历了存储矩阵的二维数组,时间复杂度为O(nm)。由于使用了sum辅助数组,空间复杂度为O(nm)。

#include <iostream>
#include <vector>

using namespace std;

int main(){
    int n, m;
    cin >> n >> m;
    vector<char> stemp(m);
    vector<vector<char>> arr(n, stemp);
    vector<int> itemp(m, 0);
    vector<vector<int>> sum(n, itemp);
    for(int i = 0;i < n;i++){
        for(int j = 0;j < m;j++){
            cin >> arr.at(i).at(j);
            if(arr.at(i).at(j) == 'l'){
                sum.at(i).at(j) = 4;
            }
            else if(arr.at(i).at(j) == 'o'){
                sum.at(i).at(j) = 3;
            }
            else if(arr.at(i).at(j) == 'v'){
                sum.at(i).at(j) = 2;
            }
            else if(arr.at(i).at(j) == 'e'){
                sum.at(i).at(j) = 1;
            }
            if(i == 0 && j != 0){
                sum.at(i).at(j) += sum.at(i).at(j - 1);
            }
            else if(i != 0 && j == 0){
                sum.at(i).at(j) += sum.at(i - 1).at(j);
            }
            else if(i != 0 && j != 0){
                sum.at(i).at(j) += max(sum.at(i).at(j - 1), sum.at(i - 1).at(j));
            }
        }
    }
    cout << sum.at(n - 1).at(m - 1);
    return 0;
}