在此之前我們先做個鋪墊:
題目大意:給定n個數,求這些數的某個連續子串行的累加和,保證這個連續子串行的累加和最大
。舉個栗子(俗稱樣例):
輸入:
7-34
9-2-58
-3
輸出:14樣例解釋:最大的呢是:4+9+(-2)+(-5)+8
由此可見,無法將加上當前數的和與當前最大值進行對比來確定答案,
雖然有負數,但之後可能有更大的數,即可以彌補加上的負數,還可以增大「最大值」
但是,剛開始的幾個負數是沒必要的
#includeusing namespace std;
int n;
int ans=-20200;//因為可能最後的最大值也可能是負數,因此我們不妨將ans的值賦得更小一些
int x;
int main()
cout<
接下來進入正題:
給定乙個正整數n( n<=500),然後輸入乙個n ×
×
n矩陣。求矩陣中最大加權矩形,即矩陣的每乙個元素都有一權值,權值定義在整數集上。從中找一矩形,矩形大小無限制,是其中包含的所有元素的和最大 。矩陣的每個元素屬於[-1100,1100]
例:
0 –2 –7 0 在左下角: 9 2
9 2 –6 2 -4 1
-4 1 –4 1 -1 8
-1 8 0 –2 和為15
在這題中,需要運用到上一題的思路,只是對矩陣的操作就有點麻煩了。暴力?不行。
這是經典的問題,我們需要將此降維,也就是說要把它包裝一下,壓成能用上題的操作解決的問題。
我們要用乙個sum陣列在輸入的時候將當前這一行的各個矩陣的和記錄下來:
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
最主要的還是之後的操作,我們用temp陣列來記錄第k行從i列到第j列的和
來個圖:
剩下的,直接枚舉行數進行累加,並以第一題的方法來解就行
二話不說,上**:
#includeusing namespace std;
int n;
int a[1100][1010]={};
int ans=-101001;
int sum[1100][1010]={};
int temp[1100]={};
void work()
} cout<>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
work();
return 0;
}
子矩陣最大累加和
問題描述如下 給定乙個矩陣matrix,其中的值有正 有負 有0,返回子矩陣的最大累加和。藍橋備戰資料 演算法很美 chapter4 多維陣列和矩陣 先想到了一維陣列的求子陣列最大累加和的題目,時間複雜度為o n 利用這種思維來處理這道題目。第一列第二列 第三列最大累加和 第一行 1 1 1 1第一...
子矩陣的最大累加和
題目 給定乙個矩陣matrix,其中的值有正 有負 有零,返回子矩陣的最大累加和。例如矩陣matrix為 90 48 78 64 40 64 81 7 66 其中,最大累加和的子矩陣為 48 78 40 64 7 66 所以返回子矩陣的最大累加和為209。解析 最簡單也最容易想到的方法是求出矩陣中的...
子矩陣的最大累加和
一 題目要求 給定乙個矩陣matrix,其中的值有正有負,有0,返回子矩陣的最大累加和,例如,矩陣matrix為 90 48 78 64 40 64 81 07 66 其中,最大累加和的子矩陣為 48 78 40 64 7 66 所以返回累加和209 二 解題思路 將矩陣matrix n n 的每一...