藍橋杯 最大子陣

2022-08-27 06:48:12 字數 1871 閱讀 1674

給定乙個nxm的矩陣a,求a中的乙個非空子矩陣,使這個子矩陣中的元素和最大。

其中,a的子矩陣指在a中行和列均連續的一塊。

輸入格式

輸入的第一行包含兩個整數n, m,分別表示矩陣a的行數和列數。

接下來n行,每行m個整數,表示矩陣a。

輸出格式

輸出一行,包含乙個整數,表示a中最大的子矩陣中的元素和。

3 3

-1 -4 3

3 4 -1

-5 -2 8

10

取最後一列,和為10。

資料規模和約定

對於50%的資料,1<=n, m<=50;

對於100%的資料,1<=n, m<=500,a中每個元素的絕對值不超過5000。

這題我是用動態規劃求解,如下圖,假設最大子矩陣的結果為從第r行到k行、從第i列到j列的子矩陣,如下所示(ari表示a[r][i],假設陣列下標從1開始):

| a11 …… a1i ……a1j ……a1n |

| a21 …… a2i ……a2j ……a2n |

| ......................|

| ...................... |

| ar1 …… ari ……arj ……arn |

| ......................|

| ...................... |

| ak1 …… aki ……akj ……akn |

| ......................|

| an1 …… ani ……anj ……ann |

那麼我們將從第r行到第k行的每一行中相同列的加起來,可以得到乙個一維陣列如下:

(ar1+……+ak1, ar2+……+ak2, ……,arn+……+akn),那麼從中我們就可以把乙個求子矩陣 的問題轉換成乙個求最大子段和 的問題,從中求出解。那麼問題又來了,什麼是最大子段和?怎麼求最大子段和?

首先,我們看乙個問題:

給定n個整數(可能為負數)組成的序列a[1],a[2],a[3],…,a[n],求該序列如a[i]+a[i+1]+…+a[j]的子段和的最大值

比如當(a1,a2,a3,a4,a4,a6)=(-1,11,-1,13,-5,-2)時,最大子段和就為23。

**b[j]=max,1<=i<=j,且1<=j<=n,則所求的最大子段和為max b[j],1<=j<=n。

由b[j]的定義可易知,當b[j-1]>0時b[j]=b[j-1]+a[j],否則b[j]=a[j]。故b[j]的動態規劃遞迴式為:

b[j]=max(b[j-1]+a[j],a[j]),1<=j<=n

int getmaxarray(int a,int n)else 

max=max>temp?max:temp;

}return max;

}

#include "stdio.h"

#includeint dp[100];

int getmaxarray(int a,int n)else

max=max>temp?max:temp;

}return max;

}int main()

}printf("%d\n", res);

}

藍橋杯 最大子陣

2.類似的題 zoj problem set 1074 給定乙個n m的矩陣a,求a中的乙個非空子矩陣,使這個子矩陣中的元素和最大。其中,a的子矩陣指在a中行和列均連續的一塊。樣例說明 取最後一列,和為10。資料規模和約定 對於100 的資料,1 n,m 500,a中每個元素的絕對值不超過5000。...

藍橋杯 最大子陣 dp

歷屆試題 最大子陣 時間限制 1.0s 記憶體限制 256.0mb 問題描述 給定乙個n m的矩陣a,求a中的乙個非空子矩陣,使這個子矩陣中的元素和最大。其中,a的子矩陣指在a中行和列均連續的一塊。輸入格式 輸入的第一行包含兩個整數n,m,分別表示矩陣a的行數和列數。接下來n行,每行m個整數,表示矩...

藍橋杯 歷屆試題 最大子陣

歷屆試題 最大子陣 時間限制 1.0s 記憶體限制 256.0mb 問題描述 給定乙個n m的矩陣a,求a中的乙個非空子矩陣,使這個子矩陣中的元素和最大。其中,a的子矩陣指在a中行和列均連續的一塊。輸入格式 輸入的第一行包含兩個整數n,m,分別表示矩陣a的行數和列數。接下來n行,每行m個整數,表示矩...