這道題當年我沒有做出來,今天微軟筆試又碰到了類似的題目
狠心要將這一塊吃透
主要還是對動態規劃掌握的不夠熟練。
n個瓶子都有編號,每次能射擊1個或多個瓶子,如果是回文的就能一次性擊倒。最少幾次能全擊倒?
輸入:[1, 2]
輸出:2
輸入:[1,3,4,1,5]
輸出:3
說明:第一次先射3,變成[1,3,1,5],因為有[1,3,1]回文可以一次擊倒,剩下[5]再一次
使用動態規劃,我們可以將射擊分為一系列子任務,用動態規劃熟悉的**表示,score[ i ] [ j ]表示要擊倒 i 到 j 瓶子至少需要幾次
那麼首先就可以知道score[0 ][0] 、score[1][1]、score[2][2] 、、、都為1(原因很顯然,只有乙個杯子,當然需要一次)
接下來,就繼續擴大範圍,看兩個兩個杯子
接下來是三個 三個
一次遞增
我們可以看到 如果 第 j 個杯子 與 第 j + i個杯子相等
那麼 score[j][j+i] 就可以等於 scores[j + 1][j + i - 1] ,也就是夾在他們中間的一段(因為動態規劃,規模小的已經最優)
但是這裡我們還需要考慮scores[j][j + k] + scores[j + k + 1][j + i] 這樣的情況(也就是把整段切分為前後兩段)
綜合以上思路,某位大佬的**如下:
//
// main.cpp
// leetcodetest
//// created by qiucheng lin on 2020/3/25.
//#include #include #include using namespace std;
int main() ;
vector> scores(n, vector(n));
for (int i = 0; i < n; i++)
for (int i = 1; i < n; i++)
for (int k = 0; k < i; k++)
}scores[j][j + i] = min_score;}}
cout << scores[0][n - 1];
return 0;
}
第二題也是關於回文的
第二題:
給乙個字串,每次可以移除其中乙個字元,或者移除乙個回文子串,求 全部移除所需最少次數
例如:14315.先移除3,再移除141,再移除5,得到最少次數3.
其實理解一下題意就會發現一模一樣。
筆試題目回憶
北京駿彩 http get與post區別 正規表示式 棧與堆的區別 多執行緒網路協議 常用協議tcp udp 資料庫基本查詢語句 1t硬碟寫滿需要多長時間 統計乙個整數的二進位制位為1的個數 23瓶藥水,一瓶有毒,用小白鼠試驗,找出30瓶五毒藥水,求最小的小白鼠數 1小時 畫uml時序圖 15個邏輯...
微軟2013暑期實習筆試回憶
一共是20道選擇題 有可能多選 答對加分,答錯扣分,所以了不敢亂選啊,現在開始回憶一些題目 1 有1000瓶水,其中1瓶是有毒的,小老鼠如果喝了有毒的水會在乙個星期後死掉,問至少需要多少只小老鼠來做實驗,才能夠在一星期後選出有毒的一瓶水。我選的是10,2 10 1024 1000,原理跟1 n選擇器...
微軟筆試題 彙總
1.臨界變數critical section的概念 還有semaphore,thread類似的這些 程序進入臨界區的排程原則是 如果有若干程序要求進入空閒的臨界區,一次僅允許乙個程序進入。任何時候,處於臨界區內的程序不可多於乙個。如已有程序進入自己的臨界區,則其它所有試圖進入臨界區的程序必須等待。進...