((由于我是新来的,可能还不了解行为准则,请随时编辑此帖子,以使其对他人更好,更有用。)
大家好!
此问题与此有关: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);
}
但是,这似乎是一个效率很低的解决方案,我真的不明白如何涵盖基本情况(否则,它将永远持续下去。
任何帮助将不胜感激。谢谢! (顺便说一句,我想创建一个新标签-竞争编程,有人可以帮助我吗?)
维护最佳解决方案的数组,其中仅考虑输入矩阵的匹配列,该数组的第i列中的值是最佳解决方案。然后,通过向arr [i-1]解决方案中添加一个图块,或向arr [i-2]解决方案中添加2个图块,arr [i] = max。将arr [-1]视为0,并将arr [0]设置为一个垂直多米诺骨牌的val。
这不是一个完整的解决方案,但是应该可以帮助您找到更快的实现。
由于您需要覆盖2xM
网格的每个正方形,因此无法像这样放置多米诺骨牌:
. . .[#|#]. .
. .[#|#]. . .
因此,基本上,每个子块的最右边的多米诺骨牌都是垂直的,或者彼此之间有两个水平的多米诺骨牌。
[如果从左侧开始,则只需要记住第一个n
或n-1
磁贴的最佳结果,然后尝试在n
-解决方案的右侧放置一个垂直的多米诺骨牌,或者在右侧放置两个水平的多米诺骨牌n-1
解决方案。更好的解决方案是最好的n+1
解决方案。您可以在一个简单的for
循环中进行计算,作为第一步,将所有部分解存储在std::vector
中。