原创 uva_10795_A Different Task(分治)

題意: 漢諾塔,給定開始局面和結束局面,問從參考局面最小需要移動多少步才能到結束局面 分析: 1.從最大的底盤開始考慮,如果最大的底盤在始態和終態中相同,那麼可以不考慮移動該底盤了,如果移動了該底盤那麼操作就不是最優的了 2.從最大的一個

原创 uva_11078_Open Credit System(DP)

題意: 給你一個長度爲N個整數序列,要求找出Ai,Aj使得(i<j), Ai-Aj最大 分析: 這個和最大子段和相似,這裏使用O(N)的DP解法 狀態:m[i]表示從[i-1, n]的最小數值 狀態轉移:m[i] = min(m[i],

原创 LA_3635/HDU_2333 Assemble (二分)

題意: 讓你去購買不同總類的配件個一個,配件總數爲n,購買的配件總價格不能超過b,且使得所購買的配件中的質量係數中最小的最大 分析: 最小最大的問題,二分枚舉能不能構成不小於k的質量係數,若能構成則ans >= k,否則ans < k.

原创 uva_11825_Hackers' Crackdown (狀態壓縮DP,好題)

分析: 這個題目的數學模型是,把集合p1, p2, p3, ..., pn分儘量多組,使得每組的並集等於S全集,其中pi表示i於i相鄰的頂點組成的集合,每組等於一個服務 把一個集合表示二進制的形式,狀態f[i]表示i所表示的集合最多分成多

原创 LA_3983 Robotruck( 單調DP )

題意: 一個機器人,收拾垃圾,收拾垃圾必須按照順序(性質很明顯),收拾完垃圾必須回到原點,兩點之間的距離是哈曼噸距離 分析: 很容易想出狀態O(N*M)的DP算法可惜狀態個數太多了,不得不這樣想: f[i]表示機器人收拾完第i個垃圾並且回

原创 uva_900 - Brick Wall Patterns( 遞推 )

題意: 給你無限個1*2的矩形,求能組成多少個以n爲底的矩形的不同形狀的矩形 分析: 因爲增加的矩形爲1*2,所以假設要求當前的以n爲底的矩形,那隻能從n-2的個數上增加一個1*2的矩形 + 從n-1的個數上增加一個2*1的矩形,忽略重複

原创 LA_3029 City Game( DP )

題意: 一個由'R'和'F'組成的m*n的矩陣,求全部F的子矩陣最大,輸出結果*3. 分析: 比較容易想到的是枚舉每個矩陣的左上和右下的頂點然後統計,這樣的時間複雜度O(N^4)太慢了,其實可以把從i行到矩陣第一行看成一個一維數組,其中裏

原创 uva_10859_Placing Lampposts( 樹形DP )

題意: 在一個n個節點,m條邊的無向無環圖中的節點中放置街燈,一個結點放置街燈那麼與這個結點爲頂點的邊都被照亮,使得每條邊都有被照亮的最少放置街燈的前提下,使得被兩個街燈照亮的邊儘量的多 分析: 在這裏的被兩個燈照亮的邊儘量的多,變一下:

原创 uva_10635_Prince and Princess ( LIS )

分析: 如果使用LCS的DP算法,時間複雜度O(n*m),可惜這裏的n高達250*250,時間不允許的,題目說明瞭一個序列中的元素唯一,所以可以將序列A離散化,然後序列B中的元素如果A中存在相同的可以mark下來,如果不存在直接刪除,這樣

原创 uva_11384_Help is needed for Dexter(貪心)

題意: 給你一個序列S = {1, 2, 3, ..., n}, 每次可以從中選擇一些元素刪除特定的數字,當然所刪除的數字必須小於等於取出來的元素,最後使得S = {0},的最小刪除次數 分析: 不難想出一個DP方法:設狀態f[1,2,3

原创 uva_11069_A Graph Problem( DP )

題意: 簡單明遼,略。 分析: 狀態:f[i][j]表示序列i到j的最大集和數量 狀態轉移:f[i][j] 那麼有兩種選擇: 1.選擇第i個,那麼第i+1個就不能選擇,這就跟f[i+2]有關了 2.選擇第i+1個,那麼第i個和第i+1個

原创 uva_11464_Even Parity(枚舉,暴力)

題意: 給你一個n*n的0,1矩陣,要求你操作最少的0邊成1,1不能變,使得n*n的矩陣變成偶數矩陣,也就是任意的一個矩陣內的元素,其上,下,左,右元素(如果存在的話)的和位偶數 分析: 最簡單的想法就是暴力想法,也就是枚舉每個0,變或不

原创 hdu_3299_Distant Galaxy( DP )

題意: n個座標,要求找一個矩形使得儘量多的座標在矩形的邊界上 分析: 考慮最優的情況,如果n多於4,那麼每條邊必然最少有一個頂點,證明略,如果枚舉每條邊界所穿過的頂點,時間複雜度O(N^5),不用說TLE,如果換個角度想,如果只要枚舉y

原创 uva_100 The 3n + 1 problem( DP )

題意: 經典問題。 分析: 如果直接算,估計要TLE了,其實對於求n的循環長度,如果n是奇數那麼只需要知道3*n+1的循環長度,如果n是偶數那麼只需要知道n/2的循環長度,容易想到的是分治+記憶化 Code: #include <set>

原创 LA_2678 - Subsequence( 二分 )

題意: 一個序列S,其中的元素全部都是正整數,求最短連續的子序列,使得其和小於等於s 分析: 由於全部元素是正整數,設f[i]爲前i個的和,那麼f是遞增的 f[j]-s >= f[i],其中i越大連續序列的長度越小,所以這裏可以使用二分求