lyk進了一家古董店,它很想買其中的一幅畫。但它帶的錢不夠買這幅畫。
幸運的是,老闆正在研究乙個問題,他表示如果lyk能幫他解出這個問題的話,就把這幅畫送給它。
老闆有乙個n*m的矩陣,他想找乙個和最大的子矩陣,這個子矩陣可以由四個引數x,y,x2,y2(1<=x<=x2<=n,1<=y<=y2<=m)來表示,表示乙個左上角為(x,y),右下角為(x2,y2)的矩陣。
為了讓遊戲更加有趣,老闆給了乙個常數p,他想將原來這個矩陣中恰好乙個數變為p,使得這個矩陣的最大的子矩陣盡可能大。
老闆想知道這個最大值是多少。
你能幫幫lyk嗎?
第一行三個數n,m,p。
接下來n行,每行m個數ai,j描述整個矩陣。
輸出乙個數表示答案。
輸入樣例#1:
3 3 3輸出樣例#1:-100 3 3
3 -4 3
3 3 3
20對於20%的資料n,m<=10。樣例解釋
改變左上角那個數。
對於40%的資料n,m<=25。
對於60%的資料n,m<=50。
對於80%的資料n,m<=100。
對於100%的資料1<=n,m<=300,|p|,|ai,j|<=1000。
40分暴力:
1view code/*預處理出二維字首和,列舉每個矩陣,當前矩陣的元素和tot可以用預處理出來的字首和算出來,然後找每個矩陣中的最小值minn,如果這個最小值minn小於p,那麼就將它改為p,tot=tot-minn+p,否則不改。 ans=max(ans,tot)
2時間複雜度o(n^3*m^3)
*/3 #include4 #include5 #include6 #include7 #include8 #include
9#define n 65
10using
namespace
std;
1112
int n,m,p,ans=-999999999
,minn,zuixiao[n][n][n][n];
13int
sum[n][n],num[n][n],tot;
1415 inline void read(int &num)16;
20for(;isdigit(c);c=getchar());
21 num*=f;22}
2324 inline int _max(int a,int
b)25
2829 inline int _min(int a,int
b)30
3334
intmain()
3545}46
for(int i=1;i<=n;i++)
4752}53
for(int i=1;i<=n;i++)
5469}70
if(minnp;
71 ans=_max(ans,tot);72}
73}74}
75}76 printf("%d"
,ans);
77fclose(stdin);
78fclose(stdout);
79return0;
80 }
正解:
1/*2view coden^2字首和+n^2預處理矩陣最小值+n^3求解
3複雜度 o(n^3)4*/
5 #include6 #include7 #include8 #include9 #include10
#define n 305
11#define inf -999999999
12using
namespace
std;
1314
intn,m,ans,p;
15int a[n][n],b[n],minn[n],dp[n][2
],sum[n][n];
1617
intmain()
1828}29
for(int i=1;i<=n;i++)
3035}36
for(int i=1;i<=n;i++)
3749
for(int k=1;k0],dp[k][1
]));
50if(i==1&&j==n)
5159}60
else ans=max(ans,max(dp[m][0],dp[m][1
]));61}
62}63 printf("
%d\n
",ans);
64return0;
65 }
清北學堂模擬賽d3t3 c
分析 一開始拿到這道題真的是無從下手,暴力都很難打出來.但是基本的方向還是要有的,題目問的是方案數,dp不行就考慮數學方法.接下來比較難想.其實對於每一行或者每一列,我們任意打亂順序其實對答案是沒有影響的.那麼我們按照高度從大到小對行和列進行排序,單獨考慮所有高度相等的行和列,組成了乙個l形,如果我...
清北學堂模擬賽d3t1 a
問題描述 你是能看到第一題的friends呢。hja 怎麼快速記單詞呢?也許把單詞分類再記單詞是個不錯的選擇。何大爺給出了一種分單詞的方法,何大爺認為兩個單詞是同一類的當這兩個單詞的各個字母的個數是一樣的,如dog和god。現在何大爺給了你 個單詞,問這裡總共有多少類單詞。輸入格式 第一行乙個整數n...
清北學堂模擬賽d3t6 c
分析 比較神奇的一道題.要把樹變成環肯定要先變成鏈,然後把鏈給拼接成環.接下來考慮乙個腦洞大開的樹形dp 設f i 0 表示i不與父節點相連的鏈數,f i 1 表示i與父節點相連的鏈數,先考慮怎麼轉移f i 0 如果i不與父節點相連,那麼i肯定與兩個子節點相連,其它的子節點都不與父節點相連,而且要剪...