CS 1373 射命丸文(二維字首和)

2021-08-08 20:36:04 字數 1673 閱讀 8104

emmmm又是乙個東方人物【好吧這不是重點】,下面的字首和和二維字首和才是23333

去尋找**記者吧

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

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

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

3 5 2 3

5 2 7 1 1

5 9 5 1 5

3 5 1 5 3

樣例輸出 sample output

33對於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

首先說一下字首和 與 二維字首和

·字首和

就是把該點前面的元素都加起來的和,我們定義對於乙個陣列a的字首和陣列s,那麼s[i] = a[1]+a[2]+…+a[i].

·二維字首和

與一維字首和類似,設s[i][j]表示所有a[i][j]的和;如果放到矩形中去理解就是把特定一整塊區域的值都加起來。

·字首和の應用

一般用來求區間和。對於一維情況,若給出乙個數列a,要求答m次詢問,每次詢問下標j到k的和。如果僅僅是普通的累計那麼tle可能離你不遠了,超時的原因一目了然,重複計算。但如果先提前算好了每乙個位置的字首和,然後用s[k]-s[j],結果就直接是這次詢問的答案,便會使計算量大大減小

二維字首和具體解釋(不會弄網上那種矩形圖(:з」∠)):

對於二維字首和來說:①②

③④⑤ s2

⑥ s1

⑦⑧ s3

⑨ o

對於一次的查詢答案ans應該等於s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1]。

這個二維字首和也稱差分序列。

因此用圖中o-s1-s3+s2區域即為最終所求的區域的字首和,因為s2代表的是1245區域

s1代表123456區域,s3代表124578區域

**如下:(寫的很醜,,主要理解下怎麼做到的就好qwq)

#include

using

namespace

std;

const

int sz = 1010;

int num[sz][sz];

int s[sz][sz];

int n,m,r,c,ans;

int main()

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

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

ans=max(ans,s[min(i+r-1,n)][min(j+c-1,m)]-s[min(i+r-1,n)][j-1]-s[i-1][min(j+c-1,m)]+s[i-1][j-1]);

cout

<'\n';

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列的彈幕消除,並且得到這一塊區域內所有彈幕的分值 累加 現在文文想要取得盡可能多...