傳送門
dp其實主要是單調佇列..
資料最大為一千,考慮o(n^2)的做法
在a*b的矩形中找出n^n的正方形再怎麼樣至少也要把a和b分別列舉吧。
必須考慮o(1)處理單個正方形最大最小值。
容易發現正方形大小不變為n,如果只看一行,就是滑動視窗,那麼處理單個正方形最大最小值時間複雜度為o(n);
仔細思考後(沒錯不管是什麼題目仔細思考後就一定能想出正解..)發現如果把單調佇列更新的值存起來為mxa[i][j],mxa[i][j]表示第i行以第j列為結尾的數列的最大值.
則要求mxb[i][j](mxb[i][j]表示以i,j為右下角的正方形的最大值)就只要對mxa豎著跑b遍單調佇列就好了..
正解出來了,但要注意i,j,的範圍..
#include#include#include
#include
#include
using
namespace
std;
intn,m,k;
int a[1007][1007
];int posx[1007],posi[1007
];int mxa[1007][1007],mia[1007][1007
];int mxb[1007][1007],mib[1007][1007
];int
main()
}memset(posx,
0,sizeof
(posx));
memset(posi,
0,sizeof
(posi));
for(int j=1;j<=m-k+1;j++)
}int ans=2147483647
;
for(int i=1;i<=n-k+1;i++)
for(int j=1;j<=m-k+1;j++)
ans=min(ans,mxb[i][j]-mib[i][j]);
cout
}
HAOI 2007 理想的正方形
有乙個a b的整數組成的矩陣,現請你從中找出乙個n n的正方形區域,使得該區域所有數中的最大值和最小值的差最小。輸入格式 第一行為3個整數,分別表示a,b,n的值 第二行至第a 1行每行為b個非負整數,表示矩陣中相應位置上的數。每行相鄰兩數之間用一空格分隔。輸出格式 僅乙個整數,為a b矩陣中所有 ...
HAOI2007 理想的正方形
時間限制 10 sec 記憶體限制 162 mb 有乙個a b的整數組成的矩陣,現請你從中找出乙個n n的正方形區域,使得該區域所有數中的最大值和最小值 的差最小。第一行為3個整數,分別表示a,b,n的值第二行至第a 1行每行為b個非負整數,表示矩陣中相應位置上的數。每 行相鄰兩數之間用一空格分隔。...
HAOI2007 理想的正方形
有乙個a b的整數組成的矩陣,現請你從中找出乙個n n的正方形區域,使得該區域所有數中的最大值和最小值的差最小.第一行為3個整數,分別表示a,b,n的值第二行至第a 1行每行為b個非負整數,表示矩陣中相應位置上的數.每行相鄰兩數之間用一空格分隔.100 的資料2 a,b 1000,n a,n b,n...