【发布时间】:2021-10-26 02:33:44
【问题描述】:
我正在尝试解决 LeetCode.com 上的this question:
给你一个 m x n 整数矩阵 mat 和一个整数目标。从矩阵的每一行中选择一个整数,以使目标与所选元素之和之间的绝对差异最小化。返回最小绝对差。 (两个数 a 和 b 的绝对差就是 a - b 的绝对值。)
所以对于输入mat = [[1,2,3],[4,5,6],[7,8,9]],target = 13,输出应该是0(因为1+5+7=13)。
我referring的解决方案如下:
int dp[71][70 * 70 + 1] = {[0 ... 70][0 ... 70 * 70] = INT_MAX};
int dfs(vector<set<int>>& m, int i, int sum, int target) {
if (i >= m.size())
return abs(sum - target);
if (dp[i][sum] == INT_MAX) {
for (auto it = begin(m[i]); it != end(m[i]); ++it) {
dp[i][sum] = min(dp[i][sum], dfs(m, i + 1, sum + *it, target));
if (dp[i][sum] == 0 || sum + *it > target)
break;
}
} else {
// cout<<"Encountered a previous value!\n";
}
return dp[i][sum];
}
int minimizeTheDifference(vector<vector<int>>& mat, int target) {
vector<set<int>> m;
for (auto &row : mat)
m.push_back(set<int>(begin(row), end(row)));
return dfs(m, 0, 0, target);
}
我不明白这个问题是如何通过动态编程来解决的。这些状态显然是i 行和sum 行(从0 行到i-1 行)。鉴于问题约束是:
m == mat.length
n == mat[i].length
1 <= m, n <= 70
1 <= mat[i][j] <= 70
1 <= target <= 800
我的理解是,我们永远不会遇到以前遇到过的sum(所有值都是正数)。即使是我添加的调试cout 语句也不会在问题中给出的示例输入上打印任何内容。
动态规划如何应用在这里?
【问题讨论】:
标签: c++ algorithm dynamic-programming