題目:
題意:給出乙個字元矩陣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 ...