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