【剑指Offer47.礼物的最大价值(DFS与动态规划)】

题目:
今天这题算是十分常规了。
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);
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值