單調棧,枚舉每一個點,計算它上面共有多少個1,最後獲取left與right值,計算max值
時間複雜度爲O( n ),只是代碼打得不好,時間比較慢,仍然AC
本題主要考察對搜索的理解,是應該枚舉點,還是枚舉邊
#include <cstdio> using namespace std; const int MAX = 2010; typedef struct _Node { int data; int n; int left; int right; }Node; Node data[MAX][MAX]; int stack[ MAX ]; int stacki; int row,col; void setn() { for( int i = 0 ; i != col ; ++i ) if( data[0][i].data == 1 ) data[0][i].n = 1; else data[0][i].n = 0 ; for( int i = 1 ; i != row ; ++i ) for( int j = 0 ; j != col ; ++j ) if( data[i][j].data == 1 ) data[i][j].n = data[i-1][j].n + 1; else data[i][j].n = 0; } void setleftright() { for( int i = 0 ; i != row ; ++i ) { stacki = 0 ; for( int j = 0 ; j != col ; ++j ) { while( stacki != 0 && data[ i ][ stack[ stacki - 1 ] ].n > data[i][j].n ) data[ i ][ stack[ --stacki ] ].right = j - 1 ; stack[ stacki++ ] = j ; } while( stacki != 0 ) data[i][ stack[ --stacki ] ].right = col - 1; stacki = 0 ; for( int j = col - 1 ; j >= 0 ; --j ) { while( stacki != 0 && data[ i ][ stack[ stacki - 1 ] ].n > data[i][j].n ) data[ i ][ stack[ --stacki ] ].left = j + 1 ; stack[ stacki++ ] = j ; } while( stacki != 0 ) data[i][ stack[ --stacki ] ].left = 0 ; } } int getmax() { int max = 0; int maxmid; for( int i = 0 ; i != row ; ++i ) for( int j = 0 ; j != col ; ++j ) if( data[i][j].data == 1 ) { maxmid = data[i][j].right - data[i][j].left + 1 ; if( maxmid * data[i][j].n > max ) max = maxmid * data[i][j].n; } return max; } int main() { while( scanf("%d%d",&row,&col) != EOF ) { for( int i = 0 ; i != row ; ++i ) for( int j = 0 ; j != col ; ++j ) scanf("%d",&data[i][j].data ); setn(); setleftright(); printf("%d/n",getmax()); } }
例題: Problem Description 對於包含n(1<=n<=100000)個整數的序列,對於序列中的每一元素,在序列中查找其位置之後第一個大於它的值,如果找到,輸出所找到的值,否則,輸出-1。 Input 輸入有多組,
1. 問題描述: 給你一個由 '('、')' 和小寫字母組成的字符串 s。 你需要從字符串中刪除最少數目的 '(' 或者 ')' (可以刪除任意位置的括號),使得剩下的「括號字符串」有效。 請返回任意一個合法字符串。 有效「括號字符串」應
#1269 : 優化延遲 時間限制:10000ms 單點時限:1000ms 內存限制:256MB 描述 小Ho編寫了一個處理數據包的程序。程序的輸入是一個包含N個數據包的序列。每個數據包根據其重要程度不同,具有不同的"
題目鏈接:1488. 避免洪水氾濫 Your country has an infinite number of lakes. Initially, all the lakes are empty, but when it rai
import java.util.Arrays; //用數組實現棧 public class Stack { private int[] array; private int top; public St
Team Queue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 20
水題,這一題上面用棧會比較好 #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int MAX = 1000; typ
單調棧問題,跟2796差不多。 要注意的是,一次棧掃描就可以決定左右邊界了。 #include <cstdio> using namespace std; const int MAX = 100010; typedef struct _N
Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 32845 Accepted: 11409 Description
【問題描述】 設停車場是一個可停放n輛汽車的狹長通道,且只有一個大門可供汽車進出。汽車在停車場內按車輛到達時間的先後順序,依次由北向南排列(大門在最南端,最先到達的第一輛車放在車場的最北端),若車場內已停滿n輛汽車,則後來的汽車只
1289 大魚喫小魚 題目來源: Codility 基準時間限制:1 秒 空間限制:131072 KB 分值: 5 難度:1級算法題 收藏 關注 有N條魚每條魚的位置及大小均不同,他們沿着X軸遊動,有的向
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 55797 Accepted: 16048 Case Time Lim
文章目錄1. 相關結構體定義1.1 順序棧1.2 鏈棧結點定義1.3 順序隊列1.4 鏈隊定義2. 順序棧相關操作3. 鏈棧相關操作4. 順序棧的應用5. 順序隊5.1 循環隊列5.2 鏈隊 1. 相關結構體定義 1.1 順序棧
【題目】 給定數組arr和整數num,共返回有多少個子數組滿足如下情況: max(arr[i…j]) - max(arr[i…j]) <= num max(arr[i…j])表示子數組arr[i…j]中的最大值,
題目鏈接:394. 字符串解碼 Given an encoded string, return its decoded string. The encoding rule is: k[encoded_string], where