關於動態規劃法的問題

2022-05-03 08:09:11 字數 969 閱讀 9437

最長上公升子串行(lis)

問題描述:設現在有一串串行,要求找出它的一串子串行,這串子序列可以不連續,但必須滿足它是嚴格的單調遞増的且為最長的。把這個長度輸出。

示例:1 7 3 5 9 4 8 結果為4

題例:參看poj 2533

解法:1. dp之o(n2)演算法:先按dp的思想來分析一下,要想求n個數的最長上公升子串行,設有資料陣列data[n]和狀態陣列dp[n],則對其尾元素data[n]來說,它的最長上公升子串行就是它自己,即dp[n]=1,而當把它的前乙個元素data[n-1]考慮進來時,如果data[n-1]data[n]那麼這個長度仍會是1。當把這個思想一般化的時候,對於任意乙個元素data[k]來說,我們需要找出在data[k]以後的元素中比data[k]大,並且最長的乙個序列做為它的後繼。這樣dp[k]就可以寫成dp[k+1]+1。現在我們定義乙個量dp[k]=m,它代表著到第k個元素為止(可以包含k也可以不包含k),它的最長上公升序列的長度為m。仔細體會dp[k]=m的意義,這裡面的k是可包括在內,也可以不包括在內的(與之前的最大子串行和不同)。要想確定這個m的值,就必須找到乙個在第k個元素之前的乙個元素的值小於data[k]的值,並且那個元素所對應的dp值是找到的滿足第乙個條件前提下dp值最大的乙個。這就意味著我們需要內層遍歷之前算出來的dp值,所以需要兩層迴圈來實現這個演算法。這樣我們就可以總結出狀態轉移方程為dp[k]=max(dp[i](1<=i<=k&&a[i]const int inf = -0x3fffffff;

int main(void)

,dp[20]=;

len = sizeof(data)/sizeof(int);

res = max = inf;

for(i=1;idata[j]&&maxmax=dp[j];

dp[i]=max+1;

if(resres = dp[i];

}printf("%d\n",res);

return 0;

}

動態規劃法

在學習動態規劃法之前,我們先來了解動態規劃的幾個概念 1 階段 把問題分成幾個相互聯絡的有順序的幾個環節,這些環節即稱為階段。2 狀態 某一階段的出發位置稱為狀態。3 決策 從某階段的乙個狀態演變到下乙個階段某狀態的選擇。4 狀態轉移方程 前一階段的終點就是後一階段的起點,前一階段的決策選擇匯出了後...

動態規劃法

有些問題在分解時會產生許多子問題,且分解出的自問題互相交織,因而在解這類問題時,將可能重複多次解乙個子問題。這種重複當然是不必要的,解決方法可以在解決每個子問題後把它的解 包括其子子問題的解 保留在乙個 中,若遇到求與之相同的子問題時,dp演算法又稱動態規劃,是資訊學競賽中選手必須熟練掌握的一種演算...

動態規劃法

最近遇到了一道挺有意思的演算法題 四種硬幣 1元3元4元5元 問 想要湊成n元錢最少幾枚硬幣?public class coinsgamemain fun 7,is public static void fun int k,int is i1 l min i2 if l k private stat...