原创 分治法--大整數的乘法

1)問題描述 就是整數太大了,超出了計算機能夠按傳統計算方式計算的範圍。 2)基本思路 就是遞歸地將大整數分爲倆個小整數,然後分解到只剩下一位數的時候再按傳統方式計算。 3)代碼實現 package laoya; import j

原创 動態規劃--多邊形遊戲

1)問題描述 多邊形遊戲是一個單人玩的遊戲,開始時有一個由n個頂點構成的多邊形。每個頂點被賦予一個整數值,每條邊被賦予一個運算符+或*。所有邊依次用整數從1到n編號,遊戲第1步,將一條邊刪除。 隨後n-1步按以下方式操作: (1)

原创 動態規劃--圖像壓縮

1)問題描述 2)基本思路 3)代碼實現 import java.util.Scanner; public class example { /** * * @param n 圖像灰度數組的

原创 動態規劃--最優二叉搜索樹

1)問題描述 利用最優二叉搜索樹來實現樹的搜索代價最小。樹上的每一個節點都有一個被搜索到的概率值pi,搜索一個節點的花費爲pi∗(depth(ki)+1),如何構造一個二叉查找樹使搜索樹上的 所有節點的花費最小即爲實現最優二叉查找

原创 分治法--排序--基於比較的排序--快速排序

1)問題描述 就是把一個無序的數組弄成有序的。 2)基本思路 快速排序分爲經典快排和隨機快排。 1 經典快排:利用最後一個數作爲分界點,小的放左邊,大的放右邊,可以使用荷蘭國旗問題(文末)的方法優化。 2 隨機快排:產生一個隨機位

原创 Manacher馬拉車算法——最長迴文子串

1)基礎 計算字符串的最長迴文字串最簡單的算法就是枚舉該字符串的每一個子串,並且判斷這個子串是否爲迴文串,這個算法的時間複雜度爲O(n3)的,而稍微優化的一個算法是枚舉迴文串的中點(動態規劃),這裏要分爲兩種情況,一種是迴文串長度

原创 分治法--排序(簡介)

基於比較的排序: 時間複雜度是O (nlogn) :隨機快排,堆排序,合併排序 時間複雜度是O (n*2): 經典快排,冒泡排序,直接選擇,直接插入 非基於比較的排序: 計數排序,桶排序,基數排序

原创 動態規劃--最長迴文子串

1)問題描述 就是找一個字符串中的最長迴文子串。 2)基本思路 首先最簡單的方法,暴力窮舉所有的子串,窮舉法總的時間複雜度爲O(n^3).很顯然,暴力算法在運行效率上是極低的。主要原因是其存在着大量重複的判斷。所以我們用以下的方法

原创 分治法--排序--基於比較的排序--直接插入排序

1)問題描述 就是把一個無序的數組弄成有序。 2)基本思路 就是把後面無序的數組插到前面去,直到所有都插入。 3)代碼實現 package laoya; import java.util.Arrays; public class

原创 分治法--線性時間選擇

1)問題描述 給定一個無序集和一個數k,找這個無序集中第k小的數。 2)基本思路 思路就是將無序集排序,然後從左到右第k個就是答案了。 問題就是如何排序,最優的排序方式就是找到無序集的中位數,然後利用該中位數進行快排,遞歸下去就o

原创 動態規劃--0-1揹包問題

1)問題描述 2)基本思路 3)代碼實現 import java.util.HashSet; import java.util.Scanner; import java.util.Set; public class ex

原创 分治法--排序--基於比較的排序--堆排序

1)問題描述 就是將一個無序的數組弄成有序的。 2)基本思路 3)代碼實現 public class Code_03_HeapSort { public static void heapSort(int[] arr) {

原创 分治法--循環賽日程表

1)問題描述 問題:設有n=2^k個選手參加循環賽,要求設計一個滿足以下要求比賽日程表: 1)每個選手必須與其它n-1個選手各賽一次; 2)每個選手一天只能賽一次。 3)比賽一共進行n-1天。 2)基本思路 就是在填下面這個表:

原创 分治法--棋盤覆蓋

1)問題描述 就是一個棋盤中有一個方格被覆蓋成黑色了,其他都是白色,我們要把除了那個黑色方格外的其他白色方格覆蓋成黑色。 2)基本思路 就是把棋盤不斷地分割成4個,覆蓋不包含黑色方格的其他3個,這樣不斷覆蓋下去。 3)代碼實現

原创 動態規劃--凸多邊形最優三角剖分

(1)問題描述 就是把一個n邊凸多邊形劃分成全都化成三角形(n-2),然後算所有三角形的周長加起來總的最小的(公共弦得重複計算)。 (2)基本思路 最小的大凸多邊形等於 “左子多邊形的最小” + “右子多邊形的最小” + “中間的