時間限制: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,你能不能對於每乙個我給出的字串,都在這個詞典裡面找到以這個字串開頭的所...