格子取数2

给定m*n的矩阵,每个位置是一个非负整数,从左上角开始,每次只能朝右和下走,走到右下角,但只走一次,求总和最小的路径。

#define N 4

int dp[2][N];

bool isVaild(int step, int x, int n) {
	if (x >= 0 && x < n && step - x >= 0 && step - x < n) {
		return true;
	}
	return false;
}

//获取上一状态的值
int getLastNum(int step, int x, int n) {
	return isVaild(step, x, n) ? dp[step % 2][x] : INT_MAX;
}

int findCellMin(int matrix[][N], int n) {
	//第0步初始化值
	for (int i = 0; i < n; ++i) {
		dp[0][i] = INT_MAX;
	}
	//原点状态
	dp[0][0] = matrix[0][0];

	//最终步数
	int endStep = 2 * n - 2;

	for (int step = 1; step <= endStep; ++step) {
		int cur = step % 2;
		for (int j = 0; j < n; ++j) {
			dp[cur][j] = INT_MAX;
			if (!isVaild(step, j, n)) {
				continue;
			}

			dp[cur][j] = min(dp[cur][j], getLastNum(step - 1, j - 1, n));
			dp[cur][j] = min(dp[cur][j], getLastNum(step - 1, j, n));
			dp[cur][j] += matrix[j][step - j];
		}
	}
	return dp[endStep % 2][n - 1];
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值