codevs 1373 射命丸文(矩陣字首和)

2021-07-24 06:18:09 字數 1561 閱讀 1266

題目描述 description在幻想鄉,射命丸文是以**聞名的鴉天狗。當然,文文的照相機可不止能夠照相,還能夠消除取景框裡面所有的彈幕。假設現在文文面前有一塊n行m列的彈幕群,每乙個單位面積內有分值有num[i][j]的彈幕。相機的取景框可以將一塊r行c列的彈幕消除,並且得到這一塊區域內所有彈幕的分值(累加)。現在文文想要取得盡可能多的分值,請你計算出她最多能夠得到的分值。

輸入描述 input description

第1行:4個正整數n,m,r,c 第2..n+1行:每行m個正整數,第i+1行第j個數表示num[i][j]

輸出描述 output description

第1行:1個整數,表示文文能夠取得的最大得分

樣例輸入 sample input

3 5 2 3

5 2 7 1 1

5 9 5 1 5

3 5 1 5 3

樣例輸出 sample output

33資料範圍及提示 data size & hint

對於60%的資料:1 <= n,m <= 200

對於100%的資料:1 <= n,m <= 1,000 1 <= r <= n, 1 <= c <= m 1 <= num[i][j] <= 1000

保證結果不超過2,000,000,000

題解:最暴力的做法就是列舉每乙個子矩陣求和找最大值,這樣顯然會超時。我們可以用矩陣字首和來做這道題。我們讀入的時候順便求一下矩陣字首和,然後就可以直接用。那麼我們怎麼通過矩陣字首和求子矩陣的和呢?其實跟字首和差不多,詳見下圖:

矩陣4的和等於最大的矩陣減去((矩陣1+矩陣2)+(矩陣1+矩陣3)- 矩陣1),矩陣字首和就是這樣233,然後我們就可以o(1)詢問某個子矩陣的和,是不是很神奇╮(╯▽╰)╭。

**如下

#include

#include

#include

using namespace std;

intsum[1010][1010],map[1010][1010];

int main()

for(int i=1;i<=n-r+1;i++)

for(int j=1;j<=m-c+1;j++)

if(sum[i+r-1][j+c-1]-sum[i+r-1][j-1]-sum[i-1][j+c-1]+sum[i-1][j-1]>maxx)//找子矩陣和的最大值

maxx=sum[i+r-1][j+c-1]-sum[i+r-1][j-1]-sum[i-1][j+c-1]+sum[i-1][j-1];

printf("%d",maxx);

return

0;}

codevs 1373 射命丸文

題目描述 description 在幻想鄉,射命丸文是以 聞名的鴉天狗。當然,文文的照相機可不止能夠照相,還能夠消除取景框裡面所有的彈幕。假設現在文文面前有一塊n行m列的彈幕群,每乙個單位面積內有分值有num i j 的彈幕。相機的取景框可以將一塊r行c列的彈幕消除,並且得到這一塊區域內所有彈幕的分...

codevs1373 射命丸文

題目描述 description 在幻想鄉,射命丸文是以 聞名的鴉天狗。當然,文文的照相機可不止能夠照相,還能夠消除取景框裡面所有的彈幕。假設現在文文面前有一塊n行m列的彈幕群,每乙個單位面積內有分值有num i j 的彈幕。相機的取景框可以將一塊r行c列的彈幕消除,並且得到這一塊區域內所有彈幕的分...

codevs 1373 射命丸文

在幻想鄉,射命丸文是以 聞名的鴉天狗。當然,文文的照相機可不止能夠照相,還能夠消除取景框裡面所有的彈幕。假設現在文文面前有一塊n行m列的彈幕群,每乙個單位面積內有分值有num i j 的彈幕。相機的取景框可以將一塊r行c列的彈幕消除,並且得到這一塊區域內所有彈幕的分值 累加 現在文文想要取得盡可能多...