NKOJ 3861 子矩陣(矩陣dp 單調佇列)

2021-08-09 18:41:00 字數 1262 閱讀 6925

問題描述

小 a 有乙個 n×m 的矩陣,矩陣中 1~n*m 這(n*m)個整數均出現過一次。 現在小 a 在這個矩陣內選擇乙個子矩陣,其權值等於這個子矩陣中的所有數的最 小值。小 a 想知道,如果他選擇的子矩陣的權值為 i(1<=i<=n×m),那麼他選擇 的子矩陣可能有多少種?小 a 希望知道所有可能的 i 值對應的結果,但是這些結 果太多了,他算不了,因此他向你求助。

輸入格式

第一行,兩個整數 n,m。

接下來的 n 行,每行 m 個整數,表示矩陣中的元素。

輸出格式

n×m 行,每行乙個整數,其中第 i 行的整數表示如果小 a 選擇的子矩陣權 值為 i,他選擇的子矩陣的種類數。

資料範圍

對於 30%的資料,1<=n,m<=50;

對於全部的資料,1<=n,m<=300。

注意到處理矩陣問題的基本套路,先考慮一維的情況,那麼顯然變成了單調佇列的模板題,即找到左邊第乙個小於它的數,和右邊第乙個小於它的數,然後乘一下就是矩陣數

那麼處理二維的情況時,列舉上下邊界,將矩陣每一列壓成乙個數,就是這一列最小的乙個數,然後仍然變成了單調佇列的模板題。複雜度o(

n2m)

**:

#include

#include

#include

#include

#define n 305

using

namespace

std;

stack

q;int n,m,map[n][n],min[n][n][n],l[n],r[n];

long

long ans[n*n];

int main()

}for(i=1;i<=m;i++)

for(j=i;j<=m;j++)

for(k=n;k>=0;k--)

q.pop();

for(k=1;k<=n;k++)ans[min[k][i][j]]+=(l[k]-k)*(k-r[k]);

}for(i=1;i<=n*m;i++)printf("%lld\n",ans[i]);

}

NKOJ 4224 矩陣計數

p4224矩陣計數 時間限制 ms空間限制 65536 kb 評測說明 1s 問題描述 給出乙個n m的方格矩陣,每個格仔裡都有乙個整數。你有兩種操作 1 x y k 將座標為x,y的格仔的數字改為k 2 x1 y1 x2 y2 k 詢問滿足值為k且座標 x,y x1 x x2 y1 y y2的格仔...

子矩陣(暴搜(全排列) DP)

一 題目 子矩陣時間限制 1 sec 記憶體限制 128 mb 提交 1 解決 1 提交 狀態 討論版 題目描述 給出如下定義 1.子矩陣 從乙個矩陣當中選取某些行和某些列交叉位置所組成的新矩陣 保持行與列的相對順序 被稱為原矩陣的乙個子矩陣。例如,下面左圖中選取第2 4行和第2 4 5列交叉位置的...

DP 壓縮矩陣 矩陣乘法 閱讀

湖南集訓 閱讀 by hta 問題描述 現在,小g 想統計共有多少權值不超過n 的不同的單詞。n 10000000 題解 很容易想到乙個dp,f i j 表示權值為i時以字母j結尾有多少鐘不同的方案。f i j f i w i k k 這演算法時間複雜度為26 26 n,對於n 10000000是無...