• 64. Minimum Path Sum(中等, 又做出一个DP题, 你们非问我开不开心,当然开心喽!^^)


    Given an m x n grid filled with nonnegative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.

    Note: You can only move either down or right at any point in time.

    动态规划问题.

    1. 状态转移公式: F[i,j] = min(F[i,j-1], F[i-1,j]) + A[i,j]
    2. 最优子结构: F[i,j-1], F[i-1,j] 和 A[i,j]
    3. 边界: F[0,0] = A[0,0];

    参照例子:

    1 2 3 4
    4 3 2 1
    2 1 2 3
    

    实现中有三种选择:

    1. 最优的: (O(m*n)) time, (O(min(m, n))) extra space;(maintain an array)
    2. 次优的: (O(m*n)) time, (O(m)+O(n)) extra space;(维护俩数组,长度分别m, n)
    3. 最差的: (O(m*n)) time, (O(m*n)) extra space.(maintain a matrix, m*n)

    自个想法,自个最优空间复杂度代码:
    (O(m*n)) time, (O(min(m, n))) extra space;

    // method 2
    // DP
    // F[i,j] = min(F[i,j-1], F[i-1,j] + A[i,j])
    // O(m*n) time, O(min(m,n)) extra space
    int minPathSum(vector<vector<int>>& A) {
    	const int m = A.size(), n = A[0].size();
    	if (m == 0) return 0;
    	if (m == 1 && n == 1) return A[0][0];
    
    	vector<int> dp(n);
    
    	// load the 0st row of A into dp  
    	dp[0] = A[0][0];
    	for (int j = 1; j < n; j++)
    		dp[j] = A[0][j] + dp[j - 1];
    
    	// fill none first row and col in dp by state transfer equation
    	for (int i = 1; i < m; i++) {
    		for (int j = 0; j < n; j++) {
    			if (j == 0) dp[j] = dp[j] + A[i][0];
    			else dp[j] = min(dp[j - 1], dp[j]) + A[i][j];
    		}
    	}
    	return dp[n - 1];
    }
    

    自个想法,自个差空间复杂度代码:
    (O(m*n)) time, (O(m*n)) extra space;

    // method 1
    // DP
    // F[i,j] = min(F[i,j-1], F[i-1,j]) + A[i,j]
    // O(m*n) time, O(m*n) extra space
    // not good
    int minPathSum(vector<vector<int>>& A) {
    	const int m = A.size(), n = A[0].size();
    	if (m == 0) return 0;
    	if (m == 1 && n == 1) return A[0][0];
    
    	// initialize dp(m*n) matrix
    	vector < vector<int> > dp(m);
    	for (int i = 0; i < m; i++)
    		dp[i].resize(n);
    
    	// fill first row in dp
    	dp[0][0] = A[0][0];
    	for (int j = 1; j < n; j++)
    		dp[0][j] = A[0][j] + dp[0][j - 1];
    
    	// fill first col in dp
    	for (int i = 1; i < m; i++)
    		dp[i][0] = A[i][0] + dp[i - 1][0];
    
    	// fill none first row and col in dp by state transfer equation
    	for (int i = 1; i < m; i++) {
    		for (int j = 1; j < n; j++) {
    			dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + A[i][j];
    		}
    	}
    	return dp[m - 1][n - 1];
    }
    
  • 相关阅读:
    LamBda学习(一)
    如何返回一个只读泛型集合
    Socket编程笔记同步
    如何快速读取大文件(看csdn一网友要求写的)没有测试具体的速度。
    如何实现项目脚本的批量生成
    如何实现WORD查找完成后不提示的代码
    W32/Pate.a 病毒处理小记
    在WORD中用VBA实现光标移动与内容选择
    2. WCF 消息操作
    3. WCF 异常处理
  • 原文地址:https://www.cnblogs.com/ZhongliangXiang/p/7466248.html
Copyright © 2020-2023  润新知