力扣 | 下降路径最小值II

简单描述题目:需要从第0行到第n-1行中把每一行中最小元素给累加,顺序走过来,不能是同一行元素。(举个例子,ans += grid[i - 1][j], 那么第[i]行就不能取第j列元素)

//没有思路的题,很多都是动态规划、

//思路: 
//状态定义 怎么表示状态	比如说在第i行添加grid[i][j],那么min_ans ? 在上一行又该怎么确定?	边界怎么确定
//状态描述
//dp[i][j] = dp[i- 1][k] + grid[i][j]	k != j	 i >= 1
//dp[0][j] = grid[0][j]

//也就是说,最终的dp[i][j]是添加第i行第j列的一个结果,能确定的是,dp[i][j] - grid[i][j] 这个值是前i - 1行的最小值,换句话说,最终的到第i行的最小值是需要遍历所有行后找最小的那个值。
//那能否先遍历每一行的最小值再确定是都要筛选这个值??	其实不太好处理	也打破了动态的规律

class Ans{
public:
	int solvtion(vector<vector<int>> &grid){
		int n = grid.size(), m = grid[0].size();
		int ans = 0;
		vector<vector<int>> dp(n, vector<int>(m, Int_max);

		for(int i = 0; i < m; ++i){
			dp[0][i] =grid[0][i];
		}
		for(int i = 1; i < n; ++i){
			for(int j = 0; j < m; ++j){
				//处理顺序下来,不选相邻列的筛选
				for(int k = 0; k < m; ++k){
					if(j == k)
						continue;
				}
				dp[i][j] = min(dp[i][j], dp[i - 1][k] + grid[i][j];
			}
		}
		for(int i = 0; i < m; ++i){
			ans = min(ans, dp[n - 1][i]);
		}
		
	}
};


你可能感兴趣的:(leetcode,算法,职场和发展)