题目:
今天这题算是十分常规了。
DFS可以做但是最后一个用例会超时。
动态规划就是常规的做法,动态转移方程为:
dp【i】【j】 = max(dp【i】【j-1】,dp【i-1】【j】)+grid【i】【j】
初始化第一行和第一列就可以了。没有什么难度。
两种方法的代码:(附带测试)
#include<iostream>
#include<algorithm>
#include<vector>
#include<unordered_map>
using namespace std;
//class Solution {
//public:
// int maxValue(vector<vector<int>>& grid) {
// int ans = 0;
// int m = grid.size();
// int n = grid[0].size();
// int sum = 0 ;
// vector<vector<bool>> visited (m,vector<bool>(n,false));
// dfs(grid,visited,0,0,ans,sum);
// return ans;
// }
//
// void dfs(vector<vector<int>>& grid,vector<vector<bool>>& visited,int i,int j,int& ans,int sum){
// sum+=grid[i][j];
// if(i==grid.size()-1&&j==grid[0].size()-1){
// ans = max(ans,sum);
// return;
// }
// vector<pair<int,int>> direction = {{1,0},{0,1}};
// visited[i][j] = true;//该节点已经访问
//
// for(int l=0;l<direction.size();l++){
// pair<int,int> sup = direction[l];
// int newi = i + sup.first;
// int newj = j + sup.second;
// if(newi<grid.size()&&newj<grid[0].size()&&visited[newi][newj]==false){
// dfs(grid,visited,newi,newj,ans,sum);
// }
// }
// visited[i][j] = false;//释放该节点的访问
// }
//};
class Solution {
public:
int maxValue(vector<vector<int>>& grid) {
int m = grid.size();
int n = grid[0].size();
vector<vector<int>> dp(m,vector<int>(n,0));
int sum = 0;
for(int i=0;i<grid.size();i++){
sum += grid[i][0];
dp[i][0] = sum;
}
sum = 0;
for(int i=0;i<grid[0].size();i++){
sum += grid[0][i];
dp[0][i] = sum;
}
for(int i=1;i<grid.size();i++){
for(int j=1;j<grid[0].size();j++){
dp[i][j] = max(dp[i-1][j],dp[i][j-1]) + grid[i][j];
}
}
// for(int i=0;i<grid.size();i++){
// for(int j=0;j<grid[0].size();j++){
// cout<<dp[i][j]<<" ";
// }
// cout<<endl;
// }
return dp[m-1][n-1];
}
};
int main(){
Solution solution;
vector<vector<int>> grid = {{1,3,1},{1,5,1},{4,2,1}};
cout<<solution.maxValue(grid);
}