我們知道子一行也是矩陣,只不過是特殊情況,首先來一道題,hdu 1506
高度h[i] 我們定義兩個陣列,分別為向左擴充套件能到的最左邊的下標,和向右擴充套件能到的最右邊的下標。
然後兩個陣列分別從正方向和反反向掃一遍
#include#includeusing namespacestd;#define ll long longll num[100005];ll l[100005],r[100005];
intmain
()return0;
}
現在特殊情況考慮完了以後,我們考慮正常矩陣
hdu 1505
這次定義乙個up陣列從上往下掃瞄,相當於矩陣的壓縮,於是每次只要對一行的up進行處理,相當於就轉換成了第乙個問題特殊情況:一行的矩陣
#include#include#include#include#includeusing namespacestd;#define oo 0x3f3f3f3f在以上基礎加條件的#define maxn 1010
intup[maxn][maxn];
intl[maxn],r[maxn];
charmap[maxn][maxn];
intmain
()ans=0;
for(
inti=1;i<=n;i++)
printf("%d\n",ans*3);
}return0;
}/*
1.00
3.71
0.04
5.19
0.00
*/
hdu 2870 題目加點要求就是允許將某個字母變成某個字母
這樣只要將字母變成對應的字母,然後對每種變換進行一次dp,找到其中最大的值,其實情況只要3三種就ok了,貪心思想:盡量讓所有的字母變成a,b,c這樣只要對a,b,c的情況dp就ok了。
#include#include#include#include#includeusing namespacestd;#define oo 0x3f3f3f3f現在稍微再改變下#define maxn 1010
intup[maxn][maxn];
intl[maxn],r[maxn];
charmap[maxn][maxn];
boolok[4][30];
voidsolve()
intmain
()for
(inti=1;i<=n;i++)
}printf("%d\n",ans);
}return0;
}/*
1.00
3.71
0.04
5.19
0.00
*/
hdu 2830 題目要求可以交換任意列任意次,一開沒想到怎麼做,看了題解發現,只要對每次的行進行列的排序,然後列舉列大到小的長度,這樣就可以找出最大的值。
#include#include#include#include#includeusing namespacestd;#define oo 0x3f3f3f3f#define maxn 1010
intup[2][maxn];
intres[maxn];
charmap[2][maxn];
intmain
()memcpy(res,up[i%2],
sizeofres);sort(res+1,res+1+m);
for(
intj=1;j<=m;j++)ans=max(ans, (m-j+1)*res[j]);
}printf("%d\n",ans);
}return0;
}/*
1.00
3.71
0.04
5.19
0.00
*/
最大子矩陣問題 dp
e acmer 題意 給你乙個矩陣,求它的所有元素和最大的子矩陣.分析 我們只知道一維的情況就是經典的最大子段和.然而維數達到二維就變的複雜了.我們觀察資料範圍500,易想到n3 的演算法也能過.純暴力是n4 的方法 然後可以通過列舉其中一維,dp最後一維的方法求出.處理列上的和為字首和,然後列舉列...
最大子矩陣 DP
time limit 10000ms memory limit 165888kb 64bit io format lld llu hysbz 1084 這裡有乙個n m的矩陣,請你選出其中k個子矩陣,使得這個k個子矩陣分值之和最大。注意 選出的k個子矩陣不能相互重疊。第一行為n,m,k 1 n 10...
最大子矩陣 dp
已知矩陣的大小定義為矩陣中所有元素的和。給定乙個矩陣,你的任務是找到最大的非空 大小至少是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 這個子矩陣的大小是15。輸入是乙個n n的矩陣。輸入的第一行給出n...