乙個有名的按摩師會收到源源不斷的預約請求,每個預約都可以選擇接或不接。在每次預約服務之間要有休息時間,因此她不能接受相鄰的預約。給定乙個預約請求序列,替按摩師找到最優的預約集合(總預約時間最長),返回總的分鐘數。
輸入: [1,2,3,1]輸出: 4
解釋: 選擇 1 號預約和 3 號預約,總時長 = 1 + 3 = 4。
輸入: [2,7,9,3,1]可以把「預約問題」轉化成陣列表示,首先它是乙個最優化問題:最優即:求可預約時間最長之和的最大值。所謂「可預約時長」,就是由規則:「不能接受相鄰預約」確定,反映到陣列中,就是不能選取「相鄰」陣列元素(這種方式描述的規則不太嚴謹)。輸出: 12
解釋: 選擇 1 號預約、 3 號預約和 5 號預約,總時長 = 2 + 9 + 1 = 12。
要求解整個陣列的「最大」可預約時長,對於元素 i 只有2種情況:被預約了 or 未被預約
dp[i][0] 第 i 個元素未被預約的情況下最大時長
dp[i][1] 第 i 個元素預約了的情況下的最大時長
對於 dp[i][0],在不預約第 i 個時間的條件下:第 i-1 個時間即可以預約,也可以不被預約,也即:dp[i][0] 從 dp[i-1][1] 或者從 dp[i-1][0] 轉化而來,都不違反「相鄰」規則。因此取二者的最大值作為 dp[i][0] 的值,即:dp[i][0] = max
對於 dp[i][1],預約了第 i 個時間,那麼第 i-1 個時間是不能預約的,只能從 dp[i-1][0] 轉化而來。因此,dp[i][1] = dp[i-1][0] + nums[i] nums[i] 表示第 i 個時間的時長。
dp[0][0] = 0;
dp[0][1] = nums[0];
遍歷 dp 陣列,比較 dp[i][0]、dp[i][1]。
class solution
//dp[i][0]表示長度為i的陣列第i個元素不被不預約時的最大時長, dp[i][1]表示長度為i的陣列 第i個元素預約時的最大時長
int dp = new int[nums.length][2];
//初始化
dp[0][0] = 0;
dp[0][1] = nums[0];
for(int i = 1; i < nums.length; i++)
//遍歷,找出最大時長
int max = integer.min_value;
for(int i = 0; i < nums.length; i++)
}return max;
}}
在遍歷找出最大時長,其實 dp 陣列的最後乙個元素就是最大值。
return math.max(dp[nums.length-1][0],dp[nums.length-1][1]);
連續子陣列最大和問題
輸入乙個整形陣列,求陣列中連續的子陣列使其和最大。比如,陣列x 應該返回 x 2.6 的和187.我們很自然地能想到窮舉的辦法,窮舉所有的子陣列的之和,找出最大值。i,j的for迴圈表示x i.j k的for迴圈用來計算x i.j 之和。maxsofar 0 for i 0,n forj i,n s...
求陣列非連續子串行的最大和
題目描述 1.乙個整數陣列l,如 l 2,3,3,50 求 l的乙個非連續子串行,使其和最大,輸出最大子串行的和。這裡非連續子串行的定義是,子串行中任意相鄰的兩個數在原序列裡都不相鄰。例如,對於 l 2,3,3,50 輸出 52 分析 很明顯,該列表最大非連續子串行為 2,50 測試例子 l 2,3...
最大和連續子陣列
問題描述 乙個數值型陣列,其子陣列有多個,求其子陣列中最大的和值。所謂和值,是指數組所有元素相加的和。解法 1 掃瞄法,維護max變數,儲存最大和,其初始值為data 0 假設最大和子陣列的第一位下標為i,i從0到n 1,對於每個i值,從data i 開始,進行累加,每加乙個數,與max變數比較一次...