简单描述题目:需要从第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]);
}
}
};