原创 hdu2861 dp

給你n個板凳m個人坐在板凳上把空的板凳分成k部分的可能數; 打表吧; dp【i】【j】【k】【0】表示i個板凳j個人k部分最後不坐人的可能數; dp【i】【j】【k】【1】表示i個板凳j個人k部分最後坐人的可能數; 開始初始化dp 狀態轉

原创 hdu 4284 floyed+狀態壓縮dp

開始看這道題其實就是一個旅行商問題具體求法都差不多:抽出關鍵點,找到最短距離,然後狀態壓縮,這道題要注意的是1.起點可能沒有包含在必須去的點裏  2  在必須去的點中如果能打工  則必須打工賺錢(感覺題意不是這樣的 不過只能這樣了) 注

原创 hdu 1876 dp

看到網上解法太多,感覺有點亂,其實就是水dp一枚,搞清遞推過程就行了; dp【i】【j】【k】k=0表示到達(i,j)這個點最多的完全消耗能量,k1小時種數,其中(i,j)這些點不是全部點,而是到達這個點能量正好爲0的點或中點; leap

原创 hdu 4230 bfs+記憶化搜索

告訴你從起點到終點最短步數的方式有多少種; mark表示每個點對應每個方向的最小步數; num表示種樹; 然後按照題意搜就行 #include<stdio.h> #include<iostream> #include<queue> #i

原创 hdu2881 dp

給你一個矩陣,每個要求  每個要求有一個t,x,y,表示在時間t到達(x,y)  問最多能滿足多少要求 開始你可能在任何地方,對每個點你有5中走法; 思路: 先對t排序,在從小枚舉起點i,時間最多爲num【i】.t,能滿足要求最大爲dp【

原创 hdu 1503 最大公共子序列+輸出路徑

#include<stdio.h> #include<string.h> #include<iostream> using namespace std; int max(int a,int b) { return a>a?a

原创 hdu 2227 樹狀數組+dp

題意是求一個數列的不遞減的子序列的個數; 很顯然,如果只用dp來做的話時間是O(n*n) 因爲dp【i】爲前i個數可能的方案,則狀態轉移方程爲dp【i】=sum(dp【j】,j<i&&num【j】<=num【i】)+1 對小數據坑定能過

原创 hdu 3450 樹狀數組優化dp

題意就不說了; hdu2227差不多只不過這道題不是遞增  而是相鄰差不超過d   其實是爲都一樣,  也有差別; 這道題沒說範圍  並且樹之間的大小關係對結果有影響,所以樹狀數組裏根據原來id來求,由於數值很大 所以還是用到離散化  

原创 hdu 1423 最長遞增公共子序列

#include<stdio.h> #include<string.h> #include<iostream> using namespace std; int max(int a,int b) { return a>b?a:b

原创 hdu2713 dp

題意是給你那個數  開始時間爲1  當時間是偶數是就加上能量 否則減去,n個能量有一定的使用順序, 中間可以有些能量不用,求最大的能量值;注意每次必須要用到一瓶藥 先遞推,最多使用n次,dp【i】【j】 表示第i次的最大值  則狀態轉移方

原创 hdu 1445 dfs剪枝

題意比較簡單;重點在剪枝上。 #include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std; int

原创 hdu 3564 線段樹+dp(最大遞增子序列)

對於數列插空問題, 常用線段樹來處理,從後往前,因爲後面的數的位置是不會改變的,對於i的位置  ,如果i位置上已經有數了,那麼就找i之後第一個空位,num【i】=k紀錄i所放的位置, 然後就按照hdu1025做法一樣了    , #in

原创 hdu 4739 dfs+暴力

看到這題第一感覺就是dfs嘛,   毫無疑問,20個點最多也不過100個正方形(如果重複的話) 但題意不能重複,所以每次深搜都暴力出能組成正方形的所有情況就ok了!! #include<stdio.h> #include<string

原创 hdu 3920 狀態壓縮dp+dfs

只想說開始沒想用dfs的   感覺麻煩    後來超時超的不行了   沒辦法  就怕遇到這卡時間的   ,其中還有個優化  就是在排序上       #include<stdio.h> #include<string.h> #incl

原创 hdu 4745 最長迴文子序列

對任意字符串,如果頭和尾相同,那麼它的最長迴文子序列一定是去頭去尾之後的部分的最長迴文子序列加上頭和尾。如果頭和尾不同,那麼它的最長迴文子序列是去頭的部分的最長迴文子序列和去尾的部分的最長迴文子序列的較長的那一個。 設字符串爲s,f(