對於n*m網格
取min(n,m)作為最大的正方形邊長
則答案可以表示成
s=1~min(n,m)
對於乙個s*s的正方形
用oblq陣列儲存有多少四個角都在這個正方形邊上的正方形
以4*4為例
除了4*4自身外,四個角在邊上的正方形還有
所以4*4網格最多可以有4種正方形存在
推出s*s網格最多可以有s種正方形存在
單看這些正方形在網格上側的點所在位置
可以發現這種「斜正方形」共有s-1種情況
且每個正方形的邊長為
因為s=c^2
所以每個正方形面積為
取和,加上原本的面積s*s,存放在oblq[s]內便於引用
然後考慮組合情況
對於乙個n*m的網格,裡面可以組合出(n-s+1)*(m-s+1)種s*s的正方形
所以每次數量加上(n-s+1)*(m-s+1)*s
面積加上(n-s+1)*(m-s+1)*oblq[s]
取和即可得到答案
**多加了個t變數,每次讓n和m遞減,t遞增,意義不變
#includeusingnamespace
std;
typedef
long
long
ll;const ll mod=1000000007
;ll oblq[
10005
];int
main()
cin>>t;
while(t--)
cout'}
return0;
}
最大的正方形
最大的正方形 描述 給你乙個n m的矩陣,每個位置的值是0或1,求乙個面積最大的子矩陣,這個矩陣必須是乙個正方形,且裡面只能由1構成,輸出最大的正方形邊長 執行時間限制 2 sec 記憶體限制 無限制 輸入 第一行輸入兩個整數n,m,之後n行,每行m個數字,為矩陣第i行第j列的值,只可能是0或者1 ...
理想的正方形
有乙個a x b的整數組成的矩陣,現請你從中找出乙個n x n的正方形區域,使得該區域所有數中的最大值和最小值的差最小。第一行為三個整數,分別表示a,b,n的值 第二行至第a 1行每行為b個非負整數,表示矩陣中相應位置上的數。輸出僅乙個整數,為axb矩陣中所有nxn正方形區域中的最大整數和最小整數的...
HAOI 2007 理想的正方形
有乙個a b的整數組成的矩陣,現請你從中找出乙個n n的正方形區域,使得該區域所有數中的最大值和最小值的差最小。輸入格式 第一行為3個整數,分別表示a,b,n的值 第二行至第a 1行每行為b個非負整數,表示矩陣中相應位置上的數。每行相鄰兩數之間用一空格分隔。輸出格式 僅乙個整數,為a b矩陣中所有 ...