這個問題和矩陣相乘比較相似,但因為它只需要計算a[1...j]的代價,因此比矩陣相乘少了一層迴圈,矩陣相稱的複雜度是n的3次方,這個問題的複雜度是n平方的。要把資料列印出來,破費了一點周折,需要好好理解,其中遞迴退出的條件是,陣列記錄的位置和自身的位置相同,但這個位置的資料也要輸出,因此在else語句中輸出最前面的哪個資料,同時最後乙個資料需要儲存在臨時變數,壓入棧中,待遞迴返回時輸出資料,整個編寫思路模擬矩陣相乘的思路。程式如下:
// lis[1,j] = max
#include #include #include void print(int value)
templatevoid printsubarray(const std::vector& array, const size_t* array_offset, size_t position, visitfun visit_fun) else
}templatevoid longestincreasesubarray(const std::vector& array) }}
printf("--%zd\n", max_length[length - 1]);
} for (int i = 0; i < array.size(); ++i)
printf("\n");
printsubarray(array, array_offset, max_position, print);
}int main(int argc, char** argv) ;
std::vectorarray(array_buffer, array_buffer + sizeof(array_buffer) / sizeof(int));
longestincreasesubarray(array);
}
陣列中最長遞增子串行
陣列是亂序的,如1,1,2,3,4,5,6,7 根據無後效性定義,陣列中當前元素所形成的子串行與其前面元素形成的子串行沒有關係,所以 lis i 1 max 1,lis k 1 其中,array i 1 arry k 且任意k i lis i 儲存對於當前陣列arry i 形成的最長子序列的長度值,...
最長遞增子串行
這是微軟實習生筆試遇到的,題意 求乙個陣列中最長遞增子串行的長度。要求選擇該題最好演算法的時間複雜度和空間複雜度。答案 時間複雜度o nlgn 空間複雜度o n 這題明顯用動態規劃來解。假設在目標陣列array 的前i個元素中,以array i 元素為最大元素的遞增子串行的長度是lis i 那麼 遞...
最長遞增子串行
最長遞增子串行又叫做最長上公升子串行 子串行,正如lcs一樣,元素不一定要求連續。本節討論實現三種常見方法,主要是練手。題 求乙個一維陣列arr i 中的最長遞增子串行的長度,如在序列1,1,2,3,4,5,6,7中,最長遞增子串行長度為4,可以是1,2,4,6,也可以是 1,2,4,6。方法一 d...