矩阵算法任务

Posted

技术标签:

【中文标题】矩阵算法任务【英文标题】:Matrices algorithm task 【发布时间】:2014-05-20 18:38:52 【问题描述】:

我被分配了一项任务,我试图弄清楚,但我很难做到。非常感谢和欢迎任何帮助。这是任务。

给定一个 N 行的方阵。你必须找到所有的总和 由每个内接的元素形成的周长 具有坐标峰值的正方形:行索引 - 第一行和第一列 index - 分别是索引从第二个到第二个的行 倒数第二个。您还必须检查这些总和(周长 I, II, III, ... 刻字) 是单调的系列。


**编辑:**

例如: 如果 N=3 我们有 3x3 矩阵:

1 2 3 4 5 6 7 8 9

内接正方形和本示例的周长由以下元素组成: 2-4-6-8 和 P=20

例如,如果我们有 4x4 矩阵 (N=4):

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

将有 2 个内切方格: 我:2-5-7-10,P=19 二:3-6-8-11,P=28 等等


这是我的草稿,如果有帮助的话

这是我目前创建的代码:

    #include <iostream>

    using namespace std;

    #define N 6
    #define M 6

    int main()
    

        int i, j , arr[N][M];
        int squaresInSquare = 0;
    /*
        cout << "Input the elements of the two dimensional array: \n\n";

        for(i=0; i<N; i++)
        
            for(j=0; j<M; j++)
            
                cout << "arr[" << i << "][" << j << "] = ";
                cin >> arr[i][j];
            
        



    //Comment these 2 loops if you want speed
    for(i=0; i<N; i++)
        
            for(j=0; j<M; j++)
            
                cout << arr[i][j] << "\t";
            
            cout << "\n";
        
     cout << endl <<endl;
    */


    // The next if-else determines how many inscribed squares we have
    if(N%2==0)
    
        //N is an even number
        int temp = N;

        while(temp!=2)
        
            temp -= 2;
            squaresInSquare += temp;
        
        cout << "The inscribed squares are: " << squaresInSquare;
    
    else
    
        //N is an odd number
        int temp = N;

        while(temp!=1)
        
            temp -= 2;
            squaresInSquare += temp;
        
        cout << "The inscribed squares are: " << squaresInSquare;
    



    int arrSums [squaresInSquare]; // this array holds the sums for every inscribed square perimeter
    for(i=0; i<squaresInSquare; i++)
    
        //here we reset the elements to 0
        arrSums[i] = 0;
    


    squaresInSquare = 0;


    if(N==1 || N==2)
    
            cout << "There are no inscribed squares";
            return 0;
    
    else if(N>=3)
    
        if(N%2==0)
        
            //N is an even number
            int temp = N;
            int k = 0;
            int step = 0;
            i=1;
            while(temp!=2)
            
                temp -= 2;
                squaresInSquare += temp; // squaresInSquare can be: 2; 4+2; 6+4+2 ...     N + (N-2) + ((N-2)-2)


                for(i; i<=N-i; i++)
                

                    arrSums[k] += arr[i][]

    ??????????????????????????????????????????????


                k++;
                
                i=i+1;



            

        
        else
        
            //N is an odd number


TODO first the algorithm for even numbers and then correct it for odd

            int temp = N;

            while(temp!=1)
            
                temp -= 2;
                squaresInSquare += temp;
            
            cout << "The inscribed squares are:  " << squaresInSquare;
        


    
        return 0;
    

【问题讨论】:

建议:首先,您能否让代码运行以正确计算 3x3 矩阵中的内接正方形?另外,为什么 N=4 的情况下没有 4 个内接正方形? 我可以计算每个矩阵集的内接正方形的数量 - 3x3,4x4... 但现在我需要找出每个内接正方形的周长的元素并填写包含的数组那些总和。 我认为您应该使用更多针对低 N 的示例解决方案来更好地解释该问题。很难理解您要计算的内容。 当我要求您解释更多时,我并不是要您重复自己。我不明白 N=4 如何只有 2 个“内接正方形”。我可以在 4x4 矩阵中绘制 4 个“钻石”。 I row 3 4 5 II row 4 0 1 III row 3 2 9 到底是什么意思?你是如何得到 5、-4、-1 和 -2 的?还有,5-4-1-2 = -2,你为什么要把它们的绝对值加起来? 当N=5时,内接正方形是一个还是三个? 【参考方案1】:

遍历大小。对于每个尺寸s,内接正方形的上顶点为[s+1, ..., N-s]。例如,当 N=7 和 s=2 时,内接正方形(该大小)的上顶点为 [3,4,5]。

下一个技巧是在矩阵中采取对角线步骤。当 N=7 时:

 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 32 33 34 35
36 37 38 39 40 41 42
43 44 45 46 47 48 49

17 点开始,您可以向下和向左移动到 23,或向下和向右移动到 25。弄清楚规则:给定N和一个起点kk下面的两个点的公式是什么(一个上下左右,另一个上下左右-对)?

完成这些步骤后,剩下的就很简单了。 (别忘了在每一步都测试你的代码。

【讨论】:

&lt;pre&gt; For this 7x7 you have 5 small: &lt;br/&gt;&lt;br/&gt; 2-8-10-16 3-9-11-17 4-10-18-12 5-11-13-19 6-12-14-20 3 larger: 3-9-11-15-19-23-25-31 4-10-12-16-20-24-26-32 5-11-13-17-21-25-27-33 1-largest: 4-10-16-22-30-38-46-40-34-28-20-12 It flashed upon me that what you have suggested but I don't know how to make the algorithm. &lt;/pre&gt; @Combine:我不能夸大这一点的重要性:你必须学会​​把一个大问题分解成小问题,然后逐个解决。你是如何计算这些列表的你的头?不要试图完美地描述它,只是给出一个粗略的轮廓:“首先我做了大小为 1 的正方形,然后是大小为 2 的正方形,以此类推,直到没有更大的正方形可以放入矩阵中。”现在你有几个更简单的问题:如何知道一个正方形何时太大,对于给定的大小,如何知道有多少个正方形以及它们在哪里,以及对于给定的大小和位置,如何制作列表。跨度> 我看到了@Beta。我会试试你说的,把它分成更小的部分。

以上是关于矩阵算法任务的主要内容,如果未能解决你的问题,请参考以下文章

周任务——矩阵和行列式

推荐系统概况:传统CTR深度学习CTR GraphEmbedding多任务学习梳理

算法211动态规划的引入 ——最大子矩阵(来自北京大学POJ)

如何让提升池访问 gsl 矩阵以线程化任务

矩阵分解在协同过滤推荐算法中的应用

什么算作 CPU 密集型任务(例如排序、搜索等?)[关闭]