前言:雖然確實有點基礎......但凡事得腳踏實地地做,基礎不牢,地動山搖,,,嗯!
dp方程:dp[i]=max
複雜度:o(n^2)
法一:資料結構無腦暴力優化
以a[i]為陣列下標,從1到a[i]訪問最大值,再加一,進行更新
法二:設h[k]表示dp值為k的最長上公升子串行的最小值(有點貪心在裡面)
顯然h[k]>=h[k-1](k>=2),證明:若存在h[k-1]>h[k],則h[k-1]可以從h[k]中轉移,故不存在h[k]>=h[k-1]
所以我們可以通過二分查詢,找到乙個最大的h[k]滿足h[k]<=a[i],則dp[i]=k+1
兩種方法的複雜度都為o(nlogn)
dp方程:
dp[i][j]=max
dp[i][j]=max//若a[i]!=b[j]則說明a[i]或b[j]對於dp值無貢獻
複雜度:o(n^2)
優化:嗯......少數有特殊性質的題目可以將lcs轉化為優化lis來做。
小聲bb:最麻煩的來了
先說複雜度o(n*m^2)的吧:
設dp[i][j]表示a序列的前i個數和b序列的前j個數且以b[j]結尾構成的lcis長度
則若a[i]!=b[j]則需找到乙個a[k]與b[j]匹配(1<=k<=i-1),故a[i]對於dp[i][j]的值無貢獻,
所以dp[i][j]=dp[i-1][j]
若a[i]=b[j]則a[i]與b[j]匹配,所以dp[i][j]=max
然後是複雜度o(nmlogm)的:
考慮類似於優化lis的優化
設h[k]表示dp值為k的lcis的最後一位b[t]的最小值,顯然h[k]也一定滿足h[k]>=h[k-1]
故可以通過二分查詢來找到最大的h[k]滿足h[k]<=b[j],則dp[i][j]=k+1
最後是複雜度o(n*m)的:
我們需要找到b[t]b[j]&&dp[i-1][j]>dp[i-1][t])t=j;
}}
基礎線性DP總結
動態規劃是一種求解最優解的思想 通常情況下要分清楚動規和貪心,什麼時候用貪心,什麼時候用動規。動規方程 dp i j a i j max。每次從i,j走有兩種選擇下dp i 1 j 和 右下dp i 1 j 1 全域性最優解包含區域性最優解。動態規劃的核心是狀態轉移方程。這是數字三角形的基礎題。in...
線性dp 區間dp
1 尼克的任務 額一道挺水的題,愣是做了幾個小時 動態規劃大致的思路還是找乙個轉移 換個詞就是影響 我們可以明顯看出本題的規則 空暇時,一遇到任務必須挑乙個接 求1 n時間內最大空暇時間 所以將任務排序是必要的,兩個關鍵字 再來想象一下當我做到第i 個任務時,我在 st i st i t i 1 時...
簡單線性DP總結
首先 動態規劃適用的條件是該問題有最優子結構 無後效性 通過每個最優子結構狀態的遞推可以推出整體的最優解 對這些基本概念的理解既要理性也要一點點感性 dp問題解決順序是 1 確定狀態 通過最後一步將問題轉化為規模更小的子問題 2 轉移方程 3 初始條件與邊界情況 4 計算順序 其中前兩步是十分重要的...