国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

[Kadane算法,前綴和思想]元素和最大的子矩陣

這篇具有很好參考價(jià)值的文章主要介紹了[Kadane算法,前綴和思想]元素和最大的子矩陣。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

元素和最大的子矩陣

題目描述

輸入一個(gè)n級方陣,請找到此矩陣的一個(gè)子矩陣,此子矩陣的各個(gè)元素的和是所有子矩陣中最大的,輸出這個(gè)子矩陣及這個(gè)最大的和。

關(guān)于輸入

首先輸入方陣的級數(shù)n,
然后輸入方陣中各個(gè)元素。

關(guān)于輸出

輸出子矩陣,
最后一行輸出這個(gè)子矩陣的元素的和。

例子輸入
4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
例子輸出
9 2
-4 1
-1 8
15
解題分析

這個(gè)程序是一個(gè)求解最大子矩陣和的問題。可以使用動(dòng)態(tài)規(guī)劃和Kadane算法。這個(gè)問題可以描述為:給定一個(gè)二維數(shù)組,找出其中的一個(gè)子矩陣,使得這個(gè)子矩陣中所有元素的和最大。

這個(gè)程序的主要思路如下:

1. 讀取一個(gè)整數(shù)`n`,然后讀取一個(gè)`n`x`n`的整數(shù)矩陣`a`。

2. 計(jì)算`total`數(shù)組,`total[i][j]`表示從`a[0][j]`到`a[i][j]`的元素之和。如果`i`為0,`total[i][j]`就等于`a[i][j]`,否則`total[i][j]`就等于`total[i-1][j]+a[i][j]`。

3. 遍歷所有可能的子矩陣。對于每一個(gè)子矩陣,計(jì)算其元素之和,然后與當(dāng)前最大的子矩陣和進(jìn)行比較。如果新的子矩陣和更大,就更新最大的子矩陣和,以及對應(yīng)的子矩陣的左上角和右下角的坐標(biāo)。

4. 在計(jì)算子矩陣和的過程中,使用了Kadane算法。Kadane算法可以在O(n)的時(shí)間復(fù)雜度內(nèi)求解最大子數(shù)組和的問題。在這個(gè)程序中,Kadane算法被用來求解每一行元素之和的最大值。

5. 最后,打印出最大子矩陣和,以及對應(yīng)的子矩陣的元素。

Kadane算法是一個(gè)用于解決最大子數(shù)組和問題的動(dòng)態(tài)規(guī)劃算法。最大子數(shù)組和問題可以描述為:在一個(gè)一維數(shù)組中,找出一個(gè)連續(xù)的子數(shù)組,使得這個(gè)子數(shù)組中所有元素的和最大。

Kadane算法的基本思想是,對于數(shù)組中的每個(gè)位置,計(jì)算以該位置為結(jié)束點(diǎn)的所有子數(shù)組中,和最大的那個(gè)子數(shù)組的和。然后,從這些和中找出最大的那個(gè),就是最大子數(shù)組和。

具體來說,算法的步驟如下:

1. 初始化兩個(gè)變量,`max_so_far`和`max_ending_here`,都設(shè)為數(shù)組的第一個(gè)元素。`max_so_far`表示到目前為止找到的最大子數(shù)組和,`max_ending_here`表示以當(dāng)前位置為結(jié)束點(diǎn)的子數(shù)組的最大和。

2. 對于數(shù)組中的每個(gè)位置,首先計(jì)算`max_ending_here + array[i]`,然后與`array[i]`比較,取較大的那個(gè)作為新的`max_ending_here`。這一步表示,如果加上當(dāng)前元素能使子數(shù)組和更大,就加上當(dāng)前元素,否則就從當(dāng)前元素開始新的子數(shù)組。

3. 然后,比較`max_so_far`和`max_ending_here`,取較大的那個(gè)作為新的`max_so_far`。這一步表示,如果`max_ending_here`比`max_so_far`大,就更新`max_so_far`。

4. 重復(fù)上述步驟,直到遍歷完數(shù)組。

5. 最后,`max_so_far`就是最大子數(shù)組和。

Kadane算法的時(shí)間復(fù)雜度是O(n),因?yàn)樗恍枰闅v一次數(shù)組。這使得它在處理大規(guī)模數(shù)據(jù)時(shí)非常高效。

舉個(gè)例子:

讓我們通過一些具體的例子來理解Kadane算法。

假設(shè)我們有一個(gè)數(shù)組`{-2, -3, 4, -1, -2, 1, 5, -3}`,我們想找到這個(gè)數(shù)組中,和最大的子數(shù)組。

我們可以按照Kadane算法的步驟來操作:

1. 初始化`max_so_far`和`max_ending_here`為數(shù)組的第一個(gè)元素`-2`。

2. 對于數(shù)組中的第二個(gè)元素`-3`,我們先計(jì)算`max_ending_here + array[i]`,得到`-2 - 3 = -5`,然后與`-3`比較,取較大的那個(gè)作為新的`max_ending_here`,所以`max_ending_here`更新為`-3`。然后,比較`max_so_far`和`max_ending_here`,取較大的那個(gè)作為新的`max_so_far`,所以`max_so_far`保持不變,還是`-2`。

3. 對于數(shù)組中的第三個(gè)元素`4`,我們先計(jì)算`max_ending_here + array[i]`,得到`-3 + 4 = 1`,然后與`4`比較,取較大的那個(gè)作為新的`max_ending_here`,所以`max_ending_here`更新為`4`。然后,比較`max_so_far`和`max_ending_here`,取較大的那個(gè)作為新的`max_so_far`,所以`max_so_far`更新為`4`。

4. 以此類推,我們可以得到以下的結(jié)果:

?? ```
?? i = 3, array[i] = -1, max_ending_here = 3, max_so_far = 4
?? i = 4, array[i] = -2, max_ending_here = 1, max_so_far = 4
?? i = 5, array[i] = 1, max_ending_here = 2, max_so_far = 4
?? i = 6, array[i] = 5, max_ending_here = 7, max_so_far = 7
?? i = 7, array[i] = -3, max_ending_here = 4, max_so_far = 7
?? ```

5. 最后,我們得到的`max_so_far`就是最大子數(shù)組和,也就是`7`。這個(gè)最大和的子數(shù)組是`{4, -1, -2, 1, 5}`。

通過這個(gè)例子,我們可以看到,Kadane算法可以有效地找到最大子數(shù)組和,而且只需要遍歷一次數(shù)組。文章來源地址http://www.zghlxwxcb.cn/news/detail-779845.html

代碼實(shí)現(xiàn)
#include <iostream>
using namespace std;

int a[1000][1000];
int total[1000][1000];
int result[1000];
int n;

int getmax(int &start,int &end){
    int local_start=0;
    int maxSum=result[0];
    int cur_max=result[0];
    for(int i=1;i<n;i++){
        if(result[i]>cur_max+result[i]){
            cur_max=result[i];
            local_start=i;
        }
        else{
            cur_max+=result[i];
        }
        if(cur_max>maxSum){
            start=local_start;
            end=i;
            maxSum=cur_max;
        }
    }
    return maxSum;
}

int main() {
    cin>>n;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++){
            cin>>a[i][j];
        }
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++){
            if(i==0) total[i][j]=a[i][j];
            else total[i][j]=total[i-1][j]+a[i][j];
        }
    int top=0,bottom=0,left=0,right=0;
    int maxSum=total[0][0];
    for(int i=0;i<n;i++)
        for(int j=i;j<n;j++){
            int start=0,end=0;
            for(int k=0;k<n;k++){
                if(i==0){
                    result[k]=total[j][k];
                }
                else{
                    result[k]=total[j][k]-total[i-1][k];
                }
            }
            int sum=getmax(start,end);
            if(sum>maxSum){
                maxSum=sum;
                top=i; bottom=j; left=start; right=end;
            }
        }
    for(int i=top;i<=bottom;i++)
        for(int j=left;j<=right;j++){
            cout<<a[i][j];
            if(j!=right) cout<<" ";
            else cout<<endl;
        }
    cout<<maxSum<<endl;
	return 0;
}

到了這里,關(guān)于[Kadane算法,前綴和思想]元素和最大的子矩陣的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • lc1074.元素和為目標(biāo)值的子矩陣數(shù)量

    lc1074.元素和為目標(biāo)值的子矩陣數(shù)量

    創(chuàng)建二維前綴和數(shù)組 兩個(gè)for循環(huán),外循環(huán)表示子矩陣的左上角(x1,y1),內(nèi)循環(huán)表示子矩陣的右下角(x2,y2) 兩個(gè)for循環(huán)遍歷,計(jì)算子矩陣的元素總和 四個(gè)變量,暴力破解的時(shí)間復(fù)雜度為 O(m^2*n^2) (m、n為matrix數(shù)組的行數(shù)和列數(shù)) 優(yōu)化 計(jì)算每一行的前綴和,而不是整個(gè)矩陣

    2024年02月14日
    瀏覽(22)
  • 【算法思考記錄】動(dòng)態(tài)規(guī)劃入門!力扣2606. 找到最大開銷的子字符串【Python3、動(dòng)態(tài)規(guī)劃】

    原題鏈接 動(dòng)態(tài)規(guī)劃(Dynamic Programming,簡稱 DP)是一種通過將原問題分解為相互重疊的子問題并只解決一次的方法來解決問題的算法優(yōu)化技術(shù)。動(dòng)態(tài)規(guī)劃通常用于優(yōu)化遞歸問題,通過存儲子問題的解來避免重復(fù)計(jì)算,從而顯著提高算法的效率。 動(dòng)態(tài)規(guī)劃的基本思想是將原問題

    2024年02月03日
    瀏覽(26)
  • C++前綴和算法:構(gòu)造乘積矩陣

    C++前綴和算法:構(gòu)造乘積矩陣

    C++算法:前綴和基礎(chǔ) 給你一個(gè)下標(biāo)從 0 開始、大小為 n * m 的二維整數(shù)矩陣 grid ,定義一個(gè)下標(biāo)從 0 開始、大小為 n * m 的的二維矩陣 p。如果滿足以下條件,則稱 p 為 grid 的 乘積矩陣 : 對于每個(gè)元素 p[i][j] ,它的值等于除了 grid[i][j] 外所有元素的乘積。乘積對 12345 取余數(shù)。

    2024年02月08日
    瀏覽(21)
  • 求矩陣中值最大的元素的值,以及所在的行號和列號

    求矩陣中值最大的元素的值,以及所在的行號和列號

    有一個(gè)3*4的矩陣,要求編程求出其中值最大的元素的值,以及所在的行號和列號,從0開始計(jì)數(shù)。 運(yùn)行結(jié)果:? ? ?

    2024年02月13日
    瀏覽(24)
  • 有一個(gè) 3*4 的矩陣,找出其中值最大的元素,及其行列號

    有一個(gè) 3*4 的矩陣,找出其中值最大的元素,及其行列號

    首先學(xué)會輸入二維數(shù)組;然后知道如何比較求最大值;最后就是格式問題; 3運(yùn)行代碼: 4總結(jié): 感謝各位的閱讀,以上就是“C語言怎么有一個(gè) 3*4 的矩陣,找出其中值最大的元素,及其行列號”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對C語言這一問題有了更深刻的體會,具

    2024年02月04日
    瀏覽(22)
  • 算法導(dǎo)論【分治思想】—大數(shù)乘法、矩陣相乘、殘缺棋盤

    算法導(dǎo)論【分治思想】—大數(shù)乘法、矩陣相乘、殘缺棋盤

    在分而治之的方法中,一個(gè)問題被劃分為較小的問題,然后較小的問題被獨(dú)立地解決,最后較小問題的解決方案被組合成一個(gè)大問題的解決。 通常,分治算法有三個(gè)部分: 分解:將問題劃分為若干子問題,這些子問題是同一問題的較小實(shí)例。 解決:通過遞歸地解決子問題來

    2024年02月03日
    瀏覽(24)
  • 算法-有序數(shù)組的平方,長度最小的子數(shù)組,螺旋矩陣II

    算法-有序數(shù)組的平方,長度最小的子數(shù)組,螺旋矩陣II

    偽裝成一個(gè)老手! 題目 給你一個(gè)按 非遞減順序 排序的整數(shù)數(shù)組 nums,返回每個(gè)數(shù)字的平方組成的新數(shù)組,要求也按非遞減順序排序。 示例 : 輸入:nums = [-4,-1,0,3,10] 輸出:[0,1,9,16,100] 解釋:平方后,數(shù)組變?yōu)?[16,1,0,9,100] 排序后,數(shù)組變?yōu)?[0,1,9,16,100] 來源:力扣977 思路 遍

    2024年02月11日
    瀏覽(27)
  • 在矩陣中查找最大值的元素 以及其所在的行號、列號(C語言)

    描述: 在一個(gè)5×6矩陣b中查找最大值的元素以及其所在的行號和列號。 輸入: 輸入5行,每行輸入6個(gè)整數(shù),整數(shù)之間用空格隔開。 輸出: 在第一行中按格式“max=××”輸出一個(gè)整數(shù)××,即矩陣b的最大值;在第二行中按格式“row=××”輸出一個(gè)整數(shù)××,即最大值所在的行號;

    2024年02月12日
    瀏覽(20)
  • 算法 || 分治法【查找最大元素和次大元素)】 #01

    對于給定的含有n元素的無序序列,求這個(gè)序列中最大和次大的兩個(gè)不同的元素。例如:(2, 5, 1, 4, 6, 3),最大元素為6,次大元素為5。 【在無序數(shù)組a[low…h(huán)igh]中找到第一大和第二大的數(shù)。兩數(shù)不同?!?采用 折半 的方式,采用分治法求解。 分解: 情況1 ,如果數(shù)組a[low…

    2023年04月09日
    瀏覽(23)
  • 和為 K 的子數(shù)組——前綴和+哈希

    和為 K 的子數(shù)組——前綴和+哈希

    題目鏈接:力扣 注意:此題不能使用滑動(dòng)窗口,因?yàn)閿?shù)組中可能會出現(xiàn)負(fù)數(shù)。也就是說右指針向后移1位不能保證區(qū)間會增大,左指針向后移1位也不能保證區(qū)間和會減小。給定左右指針的位置沒有二段性 已知sum[i]是從nums[0~i]的和,sum[i-1]是nums[0~i-1]的和 則有 sum[i] - sum[i-1] =

    2024年02月16日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包