hiho一下 第260周 最大子矩陣

2021-09-24 19:05:40 字數 1333 閱讀 4492

時間限制:10000ms

單點時限:1000ms

記憶體限制:256mb

給定乙個nxm的矩陣a和乙個整數k,小hi希望你能求出其中最大(元素數目最多)的子矩陣,並且該子矩陣中所有元素的和不超過k。

第一行包含三個整數n、m和k。

以下n行每行包含m個整數,表示a。

對於40%的資料,1 <= n, m <= 10  

對於100%的資料,1 <= n, m <= 250 1 <= k <= 2147483647 1 <= aij <= 10000

滿足條件最大的子矩陣所包含的元素數目。如果沒有子矩陣滿足條件,輸出-1。

樣例輸入

3 3 9

1 2 3

2 3 4

3 4 5

樣例輸出

4
思路:

首先我們可以列舉矩陣的左邊界和右邊界,不妨設為l和r。這一步列舉的時間複雜度是o(n^2)。

一旦確定l和r,問題就2維降到了1維。我們令

b[0] = a[0][l] + a[0][l+1] + ... + a[0][r]

b[1] = a[1][l] + a[1][l+1] + ... + a[1][r]

....

b[n-1] = a[n-1][l] + b[n-1][l+1] + ... + b[n-1][r]

經過o(n^2)的預處理字首和之後,b陣列的每一項可以o(1)求得。這裡不再贅述。

原問題就轉化為求b中最長的連續子陣列,滿足子陣列的和不超過k。

注意到矩陣a中的元素都是正整數,所以b陣列中的元素也都是正整數。於是我們就可以用雙指標(也被稱為滑動視窗)的方法解決b陣列的問題:

初始時i=j=0

只要b[i] + ... + b[j]的和小於等於k就令j累加1;否則令i累加1。

直到i==n。在此過程中,j-i的最大值就代表了最長的子陣列。

ac**:

#includeusing namespace std;

int n,m,k;

int a[300][300];

int sum[300][300];

int b[300];

int fun()

else i++;

} return u;

}int main()

} int ans=-1;

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

} printf("%d\n",(ans<=0?-1:ans));

return 0;

}

hiho一下第143周

題目1 hiho密碼 時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述 小ho根據最近在密碼學課上學習到的知識,開發出了一款hiho密碼,這款密碼的秘鑰是這樣生成的 對於一種有n個字母的語言,選擇乙個長度為m的單詞 將組成這個單詞的所有字母按照順序不重複的寫出 即遇到相...

hiho一下 第197周 逆序單詞

時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 在英文中有很多逆序的單詞,比如dog和god,evil和live等等。現在給出乙份包含n個單詞的單詞表,其中每個單詞只出現一次,請你找出其中有多少對逆序單詞。第1行 1個整數,n,表示單詞數量。2 n 50,000。第2.n ...

hiho一下 第二週

題目名稱 trie樹 小hi和小ho是一對好朋友,出生在資訊化社會的他們對程式設計產生了莫大的興趣,他們約定好互相幫助,在程式設計的學習道路上一同前進。這一天,他們遇到了一本詞典,於是小hi就向小ho提出了那個經典的問題 小ho,你能不能對於每乙個我給出的字串,都在這個詞典裡面找到以這個字串開頭的所...