Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 求矩阵中M个相邻元素最大和的最快方法是什么_C++_Algorithm_Matrix - Fatal编程技术网

C++ 求矩阵中M个相邻元素最大和的最快方法是什么

C++ 求矩阵中M个相邻元素最大和的最快方法是什么,c++,algorithm,matrix,C++,Algorithm,Matrix,假设我有一个维数为N的方阵(N=N | | column=N | | mark[row][column]){ 返回; } 总和+=材料[行][列]; 标记[行][列]=1; 如果(步数==m){ 如果(最大值

假设我有一个维数为N的方阵(N=N | | column<0 | | column>=N | | mark[row][column]){ 返回; } 总和+=材料[行][列]; 标记[行][列]=1; 如果(步数==m){ 如果(最大值<总和)最大值=总和; } 否则{ 搜索(行-1、列、和、步数+1); 搜索(行+1、列、和、步骤+1); 搜索(行、列+1、和、步骤+1); 搜索(行,列-1,和,步数+1); } 标记[行][列]=0; } int main(){ memset(mat,0,sizeof(mat)); memset(mark,0,sizeof(mark)); 最大值=0; scanf(“%d”和“&n”); scanf(“%d”、&m); 对于(int i=0;i此答案不包括代码(尚未),稍后将通过所述算法的实现进行扩展

主要的困难是某些“形状”要经过多次加工。考虑一个填充矩形的选择。它可以从任何单元格开始,以多种不同的方式(“递归路径”)遍历,以达到相同的选择(显然是相同的计算)。正是这个问题需要解决

为此,您需要预先计算可以为给定的M选择的各种形状,然后迭代矩阵,并为每个单元格(用作形状的左上角)计算和比较所有形状选择的总和

预计算是通过使用递归函数来完成的,就像在“画”A(2M-1)2矩阵的问题中,路径中的单元格,从中间开始。在结束条件(选择M个单元格)中,生成的形状将与累积的“形状列表”中的现有形状进行比较,并且仅在不存在时添加需要解决“+”形状方案


在预计算阶段应使用优化,以避免将问题从非常大的Ms的计算“转移”到预计算阶段,例如,限制遍历,使得超出起始行是非法的(因此,形状矩阵只需要是M(2M-1)大)。在我看来,DFS应该将堆栈大小保持在
O(m)
的顺序上(尽管搜索空间仍然很大)

从集合导入集合
def f(a,m):
堆栈=[]
hash=Set([])
最佳=(0,[])#总和,形状
n=len(a)
对于范围(n)内的y:
对于范围(n)内的x:
stack.append((a[y][x],Set([(y,x)]),1))
当len(stack)>0时:
s、 shape,l=stack.pop()
key=str(已排序(列表(形状)))
如果l==m且密钥不在哈希中:
hash.add(键)
如果s>最佳[0]:
最佳=(s,形状)
elif密钥不在哈希中:
hash.add(键)
对于(y,x)的形状:
如果y0且(y-1,x)不在形状中:
复制=设置(形状)
副本.添加((y-1,x))
stack.append((s+a[y-1][x],copy,l+1))
如果x0且(y,x-1)不在形状中:
复制=设置(形状)
副本.添加((y,x-1))
stack.append((s+a[y][x-1],copy,l+1))
最佳印刷品
打印长度(散列)
输出:

matrix=[[3,1,5,2]
,[2, 6, 1, 3,]        
,[1, 4, 4, 2]
,[5, 3, 2, 7]]
f(矩阵,4)
"""
(18,集合([(3,1)、(3,0)、(2,1)、(1,1)])
205散列长度
"""

M有多大?这是一个回溯算法来解决这个问题,不是吗?如果M==5,一组以“+”形式排列的五个数字可以接受吗?据我所知,您当前的程序不允许这样的形状,因为它不能在不重新访问矩阵元素的情况下通过水平和垂直运动创建。M这是一个编程竞赛吗?如果是的话,哪一个?这对大型M来说不是很贵吗?例如,Peterderiverazw显示,大约有2000亿个多胺体,有25个相连的细胞(每增加1个细胞,这个数字大约是4倍)@Peterderiverazw-这是一个很棒的信息,并提出了一个关于我的算法可行性的有趣问题,但因为我正在解决(和解决)naive算法中的一个主要缺陷也存在同样的问题,但我想这是因为工作量太大了。让我们看看是否有人提出了一个有效的算法,能够做得更好(我真的不知道怎么做……即使每次只做很少的工作,你也必须迭代所有选项),当你发现之前有人问过完全相同的问题时,要做的事情就是标记为重复。
Matrix:           For M = 3           For M = 4

3 1 5 2           3  1  5  2          3  1  5 2
2 6 1 3           2 [6] 1  3          2 [6] 1 3
1 4 4 2           1 [4][4] 2          1 [4] 4 2
5 3 2 7           5  3  2  7         [5][3] 2 7

                  Biggest = 14        Biggest = 18
#include <bits/stdc++.h>

using namespace std;

int mat[51][51];
int mark[51][51];
int m, n;
int biggest;

void search(int row, int column, int sum, int steps){
    if(row < 0 || row >= n || column < 0 || column >= n || mark[row][column]) {
        return;
    }

    sum += mat[row][column];

    mark[row][column] = 1;

    if(steps == m){

        if(biggest < sum) biggest = sum;

    }

    else{

        search(row - 1, column, sum, steps+1);
        search(row + 1, column, sum, steps+1);
        search(row, column + 1, sum, steps+1);
        search(row, column - 1, sum, steps+1);
    }

    mark[row][column] = 0;
}


int main(){

    memset(mat, 0, sizeof(mat));
    memset(mark, 0, sizeof(mark));

    biggest = 0;
    scanf("%d", &n);
    scanf("%d", &m);

    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            scanf("%d", &mat[i][j]);
        }
    }


    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            search(i, j, 0, 1);
        }
    }


    printf("%d", biggest);
    return 0;

}