Dp 關於最大子矩陣的問題總結

2021-06-27 06:44:22 字數 3643 閱讀 2954

我們知道子一行也是矩陣,只不過是特殊情況,首先來一道題,hdu 1506 

高度h[i]  我們定義兩個陣列,分別為向左擴充套件能到的最左邊的下標,和向右擴充套件能到的最右邊的下標。

然後兩個陣列分別從正方向和反反向掃一遍

#include#includeusing namespacestd;#define ll long long

ll num[100005];ll l[100005],r[100005];

intmain

()return0;

}

現在特殊情況考慮完了以後,我們考慮正常矩陣

hdu 1505

這次定義乙個up陣列從上往下掃瞄,相當於矩陣的壓縮,於是每次只要對一行的up進行處理,相當於就轉換成了第乙個問題特殊情況:一行的矩陣

#include#include#include#include#includeusing namespacestd;#define oo 0x3f3f3f3f

#define maxn 1010

intup[maxn][maxn];

intl[maxn],r[maxn];

charmap[maxn][maxn];

intmain

()ans=0;

for(

inti=1;i<=n;i++)

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

}return0;

}/*

1.00

3.71

0.04

5.19

0.00

*/

在以上基礎加條件的

hdu 2870 題目加點要求就是允許將某個字母變成某個字母

這樣只要將字母變成對應的字母,然後對每種變換進行一次dp,找到其中最大的值,其實情況只要3三種就ok了,貪心思想:盡量讓所有的字母變成a,b,c這樣只要對a,b,c的情況dp就ok了。

#include#include#include#include#includeusing namespacestd;#define oo 0x3f3f3f3f

#define maxn 1010

intup[maxn][maxn];

intl[maxn],r[maxn];

charmap[maxn][maxn];

boolok[4][30];

voidsolve()

intmain

()for

(inti=1;i<=n;i++)

}printf("%d\n",ans);

}return0;

}/*

1.00

3.71

0.04

5.19

0.00

*/

現在稍微再改變下

hdu 2830 題目要求可以交換任意列任意次,一開沒想到怎麼做,看了題解發現,只要對每次的行進行列的排序,然後列舉列大到小的長度,這樣就可以找出最大的值。

#include#include#include#include#includeusing namespacestd;#define oo 0x3f3f3f3f

#define maxn 1010

intup[2][maxn];

intres[maxn];

charmap[2][maxn];

intmain

()memcpy(res,up[i%2],

sizeofres);sort(res+1,res+1+m);

for(

intj=1;j<=m;j++)ans=max(ans, (m-j+1)*res[j]);

}printf("%d\n",ans);

}return0;

}/*

1.00

3.71

0.04

5.19

0.00

*/

最大子矩陣問題 dp

e acmer 題意 給你乙個矩陣,求它的所有元素和最大的子矩陣.分析 我們只知道一維的情況就是經典的最大子段和.然而維數達到二維就變的複雜了.我們觀察資料範圍500,易想到n3 的演算法也能過.純暴力是n4 的方法 然後可以通過列舉其中一維,dp最後一維的方法求出.處理列上的和為字首和,然後列舉列...

最大子矩陣 DP

time limit 10000ms memory limit 165888kb 64bit io format lld llu hysbz 1084 這裡有乙個n m的矩陣,請你選出其中k個子矩陣,使得這個k個子矩陣分值之和最大。注意 選出的k個子矩陣不能相互重疊。第一行為n,m,k 1 n 10...

最大子矩陣 dp

已知矩陣的大小定義為矩陣中所有元素的和。給定乙個矩陣,你的任務是找到最大的非空 大小至少是1 1 子矩陣。比如,如下4 4的矩陣 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2 的最大子矩陣是 9 2 4 1 1 8 這個子矩陣的大小是15。輸入是乙個n n的矩陣。輸入的第一行給出n...