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...