HDU 2870 DP 求最大矩陣

2022-08-23 18:03:11 字數 1837 閱讀 7581

題目:

題意:給出乙個字元矩陣matritx, 求其最大子矩陣, 詳細如題.

解題思路:

將全部字元依次轉化a, b, c, 再分別求出這三個矩陣的最大子矩陣即可.

於是, 問題轉化為求矩陣中最大的子矩陣了.

設定乙個變數num記錄位置的最大高度, num[i][j]表示matritx[i][j]位置上的最大高度

這樣, 只要列舉以各個num[i][j]為矩陣最小高度, 分別向前後推進擴充套件矩陣, 如果num[i][j + 1] >= num[i][j]則可以向前擴充套件, 同理num[i][j - 1] >= num[i][j]則可以向後擴充套件, 用h[j], t[j]分別表示當前位置 j 向前向後擴充套件的最大位置

這樣, 可以得到乙個dp式, 用以優化演算法計算過程

h[j] = h[h[j] - 1], if num[i][j] <= num[i][h[j] - 1];

t[j] = t[t[j] + 1], if num[i][j] <= num[i][t[j] + 1];

那麼, 以num[i][j]為最小高度的最大矩陣為 num[i][j] * (t[j] - h[j] + 1), 列舉所有的i, j, 取最大解.

1#include

<

iostream

>

2#include

<

cstdio

>

3#include

<

string

>

4#include

<

cstring

>

5#include

<

algorithm

>

6#include

<

vector

>

7#include

<

map>89

using

namespace

std;

1011

struct

tt12

m[300

];17

const

intmax

=1000+10

;18intn, m;

19int

num[

3][max][max];

20int

h[max], t[max];

2122

void

init()

2332}33

}3435int

solve()

3650

for(

intk =m

-1; k

>=1;

--k)

5155

for(

intk =1

; k

<=

m; ++

k)56

if(num[i][j][k]

*(t[k]

-h[k] +1

) >

ans)

57ans

=num[i][j][k]

*(t[k]

-h[k] +1

);58}59

}60return

ans;61}

6263

bool

isvalid(

char

c)64

71int

main()

72102

}103

printf(

"%d\n

", solve());

104}

105return0;

106}

HDU 1559 最大子矩陣 DP

構造二維字首和矩陣。即矩陣上的點a i j 表示左上方的點為 0,0 右下方的點為 i,j 的矩陣的和。然後列舉每乙個矩陣的左上方的點。因為矩陣的長和寬是固定的,那麼這個矩陣實際上也已經固定了。此時這個矩陣的和用公式 sum a i x 1 j y 1 a i x 1 j 1 a i 1 j y 1...

求最大子矩陣(子矩陣無大小要求)dp

總時間限制 1000ms 記憶體限制 65536kb 描述 已知矩陣的大小定義為矩陣中所有元素的和。給定乙個矩陣,你的任務是找到最大的非空 大小至少是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 這個子...

NYOJ104 最大和(dp 求最大子矩陣)

時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述 給定乙個由整數組成二維矩陣 r c 現在需要找出它的乙個子矩陣,使得這個子矩陣內的所有元素之和最大,並把這個子矩陣稱為最大子矩陣。例子 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2 其最大子矩陣為 9 2 4 ...