hdu1505 City game 最大子矩陣

2021-08-09 07:48:48 字數 1600 閱讀 6235

bob打算在城市中尋找一塊長方形的區域,已知城市中有些地已經被占用,要求我們幫助他選出最大的長方形區域。r代表已被占用,f代表未被占用。

這是hdu1506的公升級版,即從一維變成了二維。但我們依舊可以把它轉換成一維,即以每一列為乙個底,算出此列中長方形的高度,然後依次按行(即按高度)dp,找出最大值。

在每一行找出當前行中第j個點向左向右延伸的最大長度,然後乘以高度即是面積。

注意最終答案要乘以3!!!!

狀態轉移方程:

if(h[j-1] >= h[j]) l[j] = l[j-1];

if(h[j+1] >= h[j]) r[j] = r[j-1];

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

typedef

unsigned

long

long ull;

#define rep(idx1,num1) for(int idx1=0;idx1

#define pb push_back

#define empb emplace_back

#define mp make_pair

#define mem(s) memset(s,0,sizeof(s));

const

double eps = 1e-6;

const

int maxn = 1000 + 10;

int d[maxn][maxn];

int l[maxn],r[maxn];

int r1,c1;

void debug()

//debug();

int max_area = 0;

//從每一行開始

for(int i = 0; i < r1; ++i)

for(int j = c1-1; j >= 0; --j)

/*for(int j = 0; j < c1; ++j)

cout << l[j] << " ";

cout << endl;

*/for(int j = 0; j < c1; ++j)

}printf("%d\n",max_area*3);

}return

0;}

bzoj1084 SCOI2005 最大子矩陣

description 這裡有乙個n m的矩陣,請你選出其中k個子矩陣,使得這個k個子矩陣分值之和最大。注意 選出的k個子矩陣 不能相互重疊。input 第一行為n,m,k 1 n 100,1 m 2,1 k 10 接下來n行描述矩陣每行中的每個元素的分值 每個元素的 分值的絕對值不超過32767 ...

BZOJ1084 SCOI2005 最大子矩陣

portal 注意到m只能為1或2 分類討論。m 1的時候其實就是最大k段連續子段和。f i j ma x f i j ma x f k j f k j 1 sum i s um k m 2時 g i j k 表示第一列到i,第二列到j,選了k個子矩陣的最大和 那麼有一下幾種情況 都不選 g i j...

BZOJ1084 SCOI2005 最大子矩陣

這題顯然是dp。定義f i j k 表示前i行j列裡有k個矩陣的最大元素總和。因為m 2,所以可以分兩種情況分別寫乙個dp,套一套容斥就行了。如下 include include include using namespace std const int maxn 105,maxk 15 int n...