将2xM数组与2x1瓦片平铺以最大程度地增加差异-INOI 2008,P2

问题描述 投票:2回答:2

((由于我是新来的,可能还不了解行为准则,请随时编辑此帖子,以使其对他人更好,更有用。)

大家好!

此问题与此有关:Problem Link

问题简要

给定一个2xM数组,我们希望将其与2x1个图块组成图块,以使通过各个图块“覆盖”的值之差的绝对值之和最大。我们要报告此最大金额。

问题详细

在Domino Solitaire中,您有一个包含两行多列的网格。网格中的每个正方形都包含一个整数。您将获得2×1矩形矩形瓦片,每个瓦片正好覆盖网格的两个相邻正方形。您必须放置图块以覆盖网格中的所有正方形,以便每个图块覆盖两个正方形,并且没有一对图块重叠。磁贴的分数是该磁贴所覆盖的较大数字与较小数字之间的差。游戏的目的是使所有图块的总分最大化。

下面是我的代码。基本上,我做了某种递归操作,因为有两种情况:(1)开始时有一个垂直的2x1磁贴,而(2)两个水平的2x1并在一起以覆盖2列。

#include <bits/stdc++.h>
using namespace std;

int maxScore(int array[][2], int N, int i);

int main(){

    ios::sync_with_stdio(0);
    cin.tie(0);

    int N; cin >> N;
    int array[N][2]; for(int i=0;i<N;i++) cin >> array[i][0] >> array[i][1]; 

    cout << maxScore(array, N, 0);

    return 0;
}

int maxScore(int array[][2], int N, int i){
    int score1 = abs(array[i][0] - array[i][1]) + maxScore(array, N, i+1);
    int score2 = abs(array[i][0] - array[i+1][0]) + abs(array[i][1] - array[i+1][1]) + maxScore(array, N, i+2);
    return max(score1, score2);
}

但是,这似乎是一个效率很低的解决方案,我真的不明白如何涵盖基本情况(否则,它将永远持续下去。

任何帮助将不胜感激。谢谢! (顺便说一句,我想创建一个新标签-竞争编程,有人可以帮助我吗?)

c++ algorithm recursion c++14 dynamic-programming
2个回答
1
投票

维护最佳解决方案的数组,其中仅考虑输入矩阵的匹配列,该数组的第i列中的值是最佳解决方案。然后,通过向arr [i-1]解决方案中添加一个图块,或向arr [i-2]解决方案中添加2个图块,arr [i] = max。将arr [-1]视为0,并将arr [0]设置为一个垂直多米诺骨牌的val。


1
投票

这不是一个完整的解决方案,但是应该可以帮助您找到更快的实现。

由于您需要覆盖2xM网格的每个正方形,因此无法像这样放置多米诺骨牌:

. . .[#|#]. .
. .[#|#]. . . 

因此,基本上,每个子块的最右边的多米诺骨牌都是垂直的,或者彼此之间有两个水平的多米诺骨牌。

[如果从左侧开始,则只需要记住第一个nn-1磁贴的最佳结果,然后尝试在n-解决方案的右侧放置一个垂直的多米诺骨牌,或者在右侧放置两个水平的多米诺骨牌n-1解决方案。更好的解决方案是最好的n+1解决方案。您可以在一个简单的for循环中进行计算,作为第一步,将所有部分解存储在std::vector中。

© www.soinside.com 2019 - 2024. All rights reserved.