題目是引用的【http://topic.csdn.net/u/20101021/14/7fdbcd52-3ee6-42ce-b48e-8fb56c4418da.html?78938】
雅虎:
1.對於一個整數矩陣,存在一種運算,對矩陣中任意元素加一時,需要其相鄰(上下左右)某一個元素也加一,現給出一正數矩陣,判斷其是否能夠由一個全零矩陣經過上述運算得到。
2.一個整數數組,長度為n,將其分為m份,使各份的和相等,求m的最大值
比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1;
{3,6}{2,4,3} m=2
{3,3}{2,4}{6} m=3 所以m的最大值為3
搜狐:
3.四對括弧可以有多少種匹配相片順序?比如兩對括弧可以有兩種:()()和(())
創新工場:
4.求一個數組的最長遞減子序列 比如{9,4,3,2,5,4,3,2}的最長遞減子序列為{9,5,4,3,2}
微軟:
5.一個數組是由一個遞減數列左移若干位形成的,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1}左移兩位形成的,在這種數組中尋找某一個數。
我的想法:
1. 暫無
2. poj 1011,搜尋+強剪枝
3. Catalon?沒驗證,但是DP可以:
dp[i][j]表示從i->j位置的這些括弧的最大組成種數,
dp[i][j] = dp[i-1][j-1] //i是(,j是),並且他們搭配
+ sigama(dp[i][k] * dp[k+1][j]), i與k搭配,k+1與j搭配, i<k<j枚舉
初始條件:dp[i][i+1] = 1 (長度為2隻能是"()"),
dp[i][i] = 0 (長度為1不能搭配)
4. 不是普通的DP題麼,不知道為啥現在還考:
dp[i]表示到達i是的最長下降子序列的長度
dp[i] = max(dp[j]) + 1, j<i, 且a[j]>a[i]
5. 一種分情況的二分:
首先觀察這個序列,先下降,然後突然上升(暫且叫斷點吧),接著又下降,而且有個性質
(*)斷點前面的所有數都比斷點後面的所有數小!
令當前二分的區間是[l,h],那麼這個區間有3中可能性:
(1)落在斷點前的那個下降區間裡面;
(2)落在斷點後的那個下降區間裡面;
(3)跨區間。
我們看怎麼判斷當前落在哪個區間裡,另a是原來的數組
如果a[l] > a[h],由性質(*)得到不可能是跨區間的(否則因為l在斷點前的區間,h在斷點後的區間,那麼肯定有a[l]<a[h]),那麼只可能是(1)或者(2),這樣這個區間就是普通的下降區間,用常規的二分在這個區間裡找數。
如果a[l] < a[h], 那麼肯定是跨區間的,考慮中間值a[(l+h)/2],如果這個中間值>a[l],那麼根據性質(*)中間值在斷點後,否則就在斷點之前。如果中間值是斷點之後,那麼[(l+h)/2, h]形成一個下降區間,看我們找的value是不是落在這裡面,如果是下一部搜尋區間就是[(l+h)/2, h],不然就是[l, (l+h)/2]。如果中間值是斷點之前,那麼[l, (l+h)/2]形成一個下降區間,value如果落在裡面,下一步搜尋區間就是[l, (l+h)/2],不然就是[(l+h)/2, h]。