题目:
#include <bits/stdc++.h>
using namespace std;
int n,m;
int dp(vector<vector<int>>&grid,vector<vector<int>>&memo,int x,int y){
int dx[] = {0,0,0,-1,-1,-1,-2,-2,-3};
int dy[] = {-1,-2,-3,0,-1,-2,0,-1,0}; //根据走的步数<=3,列举出来之前走过来的方向
//base case
if(x < 0 || y < 0) return INT_MIN;
if( x == 0 && y == 0 ) return grid[0][0];
if(memo[x][y] != INT_MIN) return memo[x][y]; //如果不是未赋值的,就返回(x,y)最大权重值之和
//condition transfer
int temp = INT_MIN;
for(int i=0;i<9;i++){
int q = dp(grid, memo, x + dx[i], y + dy[i]);
if(q == INT_MIN) continue; //出界,向其他方向走
temp = max(temp, q); //取所有方向中的最大值
}
//备忘录memo更新
memo[x][y] = temp + grid[x][y]; //上一步的最大权重值+现在这个格子的权重值
return memo[x][y];
}
int main(){
cin>>n>>m;
//创建并赋值grid(方格)数组
vector<vector<int>>grid(n,vector<int>(m));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>grid[i][j];
}
}
//调用dp函数解决问题:
vector<vector<int>> memo(n, vector<int>(m, INT_MIN)); //所有memo初始化数值为INI_MIN
cout<<dp(grid,memo,n-1,m-1);
return 0;
摘录自题解里面第一位大佬的答案。
自顶向下的递归方式。
由dp(n-1,m-1)逐步递归到(0,0),然后返回,类似入栈出栈的过程。
递归结构:
- base case 最后叶子节点返回的数值
- 状态转移方程
- 处理完子问题的返回 中间过程中返回的式子
加油!