亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

【vijos】1764 Dual Matrices(dp)

系統 1667 0

https://vijos.org/p/1764

自從心態好了很多后,做題的確很輕松。

這種題直接考慮我當前拿了一個,剩余空間最大能拿多少即可。

顯然我們枚舉每一個點拿出一個矩形(這個點作為右下角),然后剩余空間我們只需要考慮i+1~n和j+1~m這一塊空間即可(至于為什么多想想QAQ)

所以我們維護i+1~n和j+1~m能取到的最大矩形即可。

顯然二維前綴和,然后再維護一個二維

mx[i][j]=max{get(i, j), mx[i+1][j], mx[i][j+1]},然后每一次找一個點i,j時只需要加上max{mx[i+1][1], mx[1][j+1]}即可。

      #include <cstdio>

#include <cstring>

#include <cmath>

#include <string>

#include <iostream>

#include <algorithm>

#include <queue>

using namespace std;

#define rep(i, n) for(int i=0; i<(n); ++i)

#define for1(i,a,n) for(int i=(a);i<=(n);++i)

#define for2(i,a,n) for(int i=(a);i<(n);++i)

#define for3(i,a,n) for(int i=(a);i>=(n);--i)

#define for4(i,a,n) for(int i=(a);i>(n);--i)

#define CC(i,a) memset(i,a,sizeof(i))

#define read(a) a=getint()

#define print(a) printf("%d", a)

#define dbg(x) cout << (#x) << " = " << (x) << endl

#define printarr2(a, b, c) for1(_, 1, b) { for1(__, 1, c) cout << a[_][__]; cout << endl; }

#define printarr1(a, b) for1(_, 1, b) cout << a[_] << '\t'; cout << endl

inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }

inline const int max(const int &a, const int &b) { return a>b?a:b; }

inline const int min(const int &a, const int &b) { return a<b?a:b; }



const int N=1005, oo=~0u>>2;

int arr[N][N], sum[2][N][N], mx[N][N], n, m, a, b, ans=-oo;



int get(int x, int y, int k) {

	int ret=-oo, fx=x-(k*a)+k, fy=y-(k*b)+k, now=(k==1?0:1);

	if(fx>=1 && fy>=1 && fx<=n && fy<=m) ret=max(ret, sum[now][x][y]-sum[now][fx-k][y]-sum[now][x][fy-k]+sum[now][fx-k][fy-k]);

	fx=x-(k*b)+k, fy=y-(k*a)+k;

	if(fx>=1 && fy>=1 && fx<=n && fy<=m) ret=max(ret, sum[now][x][y]-sum[now][fx-k][y]-sum[now][x][fy-k]+sum[now][fx-k][fy-k]);

	return ret;

}

int main() {

	read(n); read(m); read(a); read(b);

	for1(i, 1, n) for1(j, 1, m) read(arr[i][j]);

	for1(i, 1, n) for1(j, 1, m) sum[0][i][j]=sum[0][i-1][j]+sum[0][i][j-1]-sum[0][i-1][j-1]+arr[i][j];

	for3(i, n, 1) for3(j, m, 1) sum[1][i][j]=sum[1][i+1][j]+sum[1][i][j+1]-sum[1][i+1][j+1]+arr[i][j];

	for3(i, n+1, 0) for3(j, m+1, 0) mx[i][j]=-oo;

	for3(i, n, 1) for3(j, m, 1) mx[i][j]=max(get(i, j, -1), max(mx[i][j+1], mx[i+1][j]));

	for1(i, 1, n) for1(j, 1, m) ans=max(ans, get(i, j, 1)+max(mx[i+1][1], mx[1][j+1]));

	if(ans==-oo) puts("Impossible");

	else print(ans);

	return 0;

}


    

?

?


?

?

描述

一個N行M列的二維矩陣,矩陣的每個位置上是一個絕對值不超過1000的整數。

你需要找到兩個不相交的A*B的矩形,使得這兩個矩形包含的元素之和盡量大。

注:A*B的矩形指連續的A行、B列的子矩陣,或連續的B行、A列的子矩陣。不相交指兩個矩形無公共元素。

格式

輸入格式

第一行包括4個正整數N,M, A, B,之間由空格隔開。

以下N行,每行M個整數,之間由空格隔開,依次表示二維矩陣的每個元素。

輸出格式

輸出一行,一個整數,表示答案。如果找不到兩個不相交的A*B的矩形,輸出"Impossible"。

樣例1

樣例輸入1 [復制]

            3 4 1 2

1 -1 3 4

-1 9 -1 1

9 8 5 2
          

樣例輸出1 [復制]

            25
          

限制

1s

提示

30%的數據滿足,1 <= N, M <= 50.
另外30%的數據滿足,A = B.
100%的數據滿足,1 <= N, M <= 1 000, 1 <= A, B <= N.

【vijos】1764 Dual Matrices(dp)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲一区在线免费观看 | 国产日韩欧美亚洲精品95 | 一级毛片一级毛片免费毛片 | 91精品国产三级在线观看 | 色综合天天综合网国产人 | 成年女人午夜毛片免费看 | 亚洲午夜一级毛片 | 国产精品久久在线观看 | 亚洲国产精品综合久久 | 精品外国呦系列在线观看 | 国产成人精品曰本亚洲78 | 免费视频精品一区二区 | 亚洲日本人成网站在线观看 | 热热涩热热狠狠色香蕉综合 | 国产品精人成福利视频 | 一级黄色毛片子 | 很黄的网站在线观看 | 中文字幕国产在线观看 | 欧美成人精品一级高清片 | 日本三级不卡 | 2020国产精品视频免费 | 免费看欧美一级特黄a大片一 | 四虎精品国产一区二区三区 | 成人看的午夜免费毛片 | 日日干天天爽 | 免费在线观看一级片 | 欧美xxx精品 | 日韩欧一级毛片在线播无遮挡 | 天天射天天爱天天干 | 99久久综合精品国产 | 亚洲偷图色综合色就色 | 成人区精品一区二区毛片不卡 | 欧美日本在线一区二区三区 | 亚洲国产成a人v在线观看 | 久久免费香蕉视频 | 午夜伦y4480影院中文字幕 | 精品视频一二三区 | 欧美高清在线视频在线99精品 | 日本不卡视频网站 | 日本伊人色综合网站 | 亚洲人和日本人hd |