我正在尝试使用动态编程来解决这个问题,但得到了错误的答案。我认为我使用的复发是不正确的。该问题的递归关系应该是什么,dp状态应该包含哪些信息?目前,我正在使用一个二维数组,其中 dp [i] [j] 表示大小为(ixj)的矩形的最大勺数,所以答案将会be
- > Problem Statement
我的代码:
1)s [n] [n]是问题中给出的网格。
2)end [i] [j]。如果在(i×j)矩形的解中使用s [i] [j],则首先为1,否则为0。
3)end [i] [j]。如果s [i] [j]与upper-#连接则秒为1,如果为left-#则为2,如果不使用s [i] [j]则为0
int dp[n][n];
pair<int, int> end[n][n];
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
// w is the answer for (i x j) without using s[i][j]
w = (i - 1 >= 0 ? dp[i - 1][j] : 0) + (j - 1 >= 0 ? dp[i][j - 1] : 0) - (i - 1 >= 0 && j - 1 >= 0 ? dp[i - 1][j - 1] : 0);
if (i - 1 >= 0 && j - 1 >= 0 && end[i - 1][j].first == 1 && end[i - 1][j].second == 2 && end[i][j - 1].first == 1 && end[i][j - 1].second == 1) w--;
x = y = 0;
if (s[i][j] == '#') {
if (i > 0) {
// using the upper # if present
if (s[i - 1][j] == '#') x = 1 + (i - 2 >= 0 ? dp[i - 2][j] : 0) + (j - 1 >= 0 ? dp[i][j - 1] : 0) - (i - 2 >= 0 && j - 1 >= 0 ? dp[i - 2][j - 1] : 0);
if (i - 2 >= 0 && j - 1 >= 0 && end[i - 1][j - 1].first == 1 && end[i - 1][j - 1].second == 1 && end[i - 2][j].first == 1 && end[i - 2][j].second == 2) x--;
if (x <= w) x = 0;
}
if (j > 0) {
//using the left # if present
if (s[i][j - 1] == '#') y = 1 + (i - 1 >= 0 ? dp[i - 1][j] : 0) + (j - 2 >= 0 ? dp[i][j - 2] : 0) - (i - 1 >= 0 && j - 2 >= 0 ? dp[i - 1][j - 2] : 0);
if (i - 1 >= 0 && j - 2 >= 0 && end[i - 1][j - 1].first == 1 && end[i - 1][j - 1].second == 2 && end[i][j - 2].first == 1 && end[i][j - 2].second == 1) y--;
if (y <= w) y = 0;
}
}
// choosing the maximum of the three and accordingly assigning end[i][j]
if (w >= x && w >= y) {
dp[i][j] = w;
end[i][j] = make_pair(0, 0);
} else if (x > w && x > y) {
dp[i][j] = x;
end[i][j] = make_pair(1, 1);
} else {
dp[i][j] = y;
end[i][j] = make_pair(1, 2);
}
}
}
答案 0 :(得分:0)
这个问题与动态编程无关。这是关于最大匹配。让我们用黑白颜色(如棋盘)绘制网格。现在我们有一个二分图(黑色单元格在第一部分,白色单元格在第二部分)。如果它们都含有油,我们应该在相邻的细胞之间添加边缘。答案是此图中最大匹配的大小。