描述
給定長度為n的a陣列,長度為k的b陣列
你可以從a陣列裡取k個數
規則如下:
即每次可以從a陣列的最左邊或者最右邊取走乙個數,取走的數從陣列中移除
將取出的ai按取出的順序組成c陣列
求b與c的內積最大值
b與c內積為∑i=0k−1bi×ci
解釋1:lintcode 領扣a= [1,4,3,2,5]
b=[1,2,3,4]
k=4
取出a0 ,
c=[1]
取出a4
c=[1,5]
取出a1
c=[1,5,4]
取出a2
c=[1,5,4,3]
b·c=1*1+2*5+3*4+4*3=35
這只是c的一種可行方案,可能不是最優方案
解釋2
a=[1,2,3,4]
不能直接取出
a1 因為
a0和a2都沒有取出
樣例
[2,3,5,1]
[2,1]
取出a0,a1
演算法dp
dp方程 dpijdpij表示從左邊取了i個數,從右邊取了j個數的最大內積
dp方程轉移
即判斷上一次從左邊取還是從右邊取數哪個內積更大
dp邊界條件 dp00=0dp00=0 兩邊都沒取數 內積為0
答案 ans=max(ans,dpik−i)ans=max(ans,dpik−i) 即列舉左邊取了多少個數,答案取dp陣列最大值
複雜度分析
public
class
solutionif(
i+j>n)
//dp陣列邊界條件,從左右都不取數的時候,dp[0][0]=0 if(
i==0&&
j==0)
//從左邊取的i 更新dp[i][j] if(
i!=0)
//從右邊取的j,更新dp[i][j] if(
j!=0)
}}//列舉從左邊取了多少,找最大的內積
long
ans=0;
for(
inti=0
;i<=k;
i++)
return
ans;
}}
更多題解參考:九章演算法 九章演算法 Google 面試題 解碼方法
有乙個訊息包含 a z 通過以下規則編碼 a 1 b 2 z 26 現在給你乙個加密過後的訊息,問有幾種解碼的方式 樣例 1 輸入 12 輸出 2 解釋 它可以被解碼為 ab 1 2 或 l 12 樣例 2 輸入 10 輸出 1 演算法 動態規劃 dp 演算法思路 思路 複雜度分析 n表示字串長度 ...
九章演算法 Google面試題 島嶼的個數II
給定 n,m,分別代表乙個二維矩陣的行數和列數,並給定乙個大小為 k 的二元陣列a.初始二維矩陣全0.二元陣列a內的k個元素代表k次操作,設第i個元素為 a i x,a i y 表示把二維矩陣中下標為a i x行a i y列的元素由海洋變為島嶼.問在每次操作之後,二維矩陣中島嶼的數量.你需要返回乙個...
九章演算法 Google 面試題 奇怪的印表機
作者 陳近南 專欄 九章演算法 乙個奇怪的印表機列印時遵守以下兩個特殊的條件 每次只能列印同乙個字元組成的連續序列。每次列印可以在任何位置開始,在任何位置結束,列印的字元會將原來已有的字元覆蓋。給定乙個只包含小寫字母的字串,你的任務是計算用該印表機列印出這個字串所需的最少列印次數。字串長度不超過10...