复发关系应该是什么?

时间:2015-01-14 21:43:00

标签: algorithm dynamic-programming

我正在尝试使用动态编程来解决这个问题,但得到了错误的答案。我认为我使用的复发是不正确的。该问题的递归关系应该是什么,dp状态应该包含哪些信息?目前,我正在使用一个二维数组,其中 dp [i] [j] 表示大小为(ixj)的矩形的最大勺数,所以答案将会be [d - 1] [n - 1] 。
- > 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);
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

这个问题与动态编程无关。这是关于最大匹配。让我们用黑白颜色(如棋盘)绘制网格。现在我们有一个二分图(黑色单元格在第一部分,白色单元格在第二部分)。如果它们都含有油,我们应该在相邻的细胞之间添加边缘。答案是此图中最大匹配的大小。