動態規劃專題

2022-06-27 16:12:08 字數 1420 閱讀 4616

例一:有一段樓梯有10級台階,規定每一步只能跨一級或兩級,要登上第10級台階有幾種不同的走法?

1 #include 2 #include

3 #include

4 #include5

using

namespace

std;

6int solution(int n) //

遞迴做法713

int dp[11]=;

14int solution1(int n) //

做法二 建陣列存資料避重複

1521

intmain()

第一題:被3整除的子串行

題解:關鍵思路:

明確什麼是子串行,類似於集合的東西,不需要連續

我們的關鍵是狀態的變化

遍歷字串,把該字元加進來,這個序列中:與3取模為0,為1,為2的數目的變化。

dp[0]表示目前該序列中與3取模為0的子串行個數

dp[1]表示目前該序列中與3取模為1的子串行個數

dp[2]表示目前該序列中與3取模為2的子串行個數

我們把該字元分為三類:該字元與3取模為0,  該字元與3取模為1,  該字元與3取模為2

該字元與3取模為0:

dp[0]=dp[0]+dp[0]+1;//原來沒加該字元與3取模為0的子串行數目+原來沒加該字元與3取模為0的子串行加上該字元的組合+該字元單獨組成的序列(長度為1)    //   3t*10+3r=3(t'+r)    假設該字元為3r,原序列為3t   該字元假設加在末尾   多了乙個字元   子串行就變為3t*10+3r

dp[1]=dp[1]+dp[1];//原來沒加該字元與3取模為1的子串行數目+原來沒加該字元與3取模為1的子串行加上該字元的組合  // (3t+1)*10+3r

dp[2]=dp[2]+dp[2]//原來沒加該字元與3取模為2的子串行數目+原來沒加該字元與3取模為2的子串行加上該字元的組合   // (3t+2)*10+3r

該字元與3取模為1:

差不多的道理,懶得寫,自己去看下面的公式

該字元與3取模為2:

差不多的道理

注意什麼是序列,求的是什麼

#includeusing

namespace

std;

#define mod 1000000007

intmain()

if(t%3==1

)

if(t%3==2

) dp0=a%mod;

dp1=b%mod;

dp2=c%mod;

}cout

}

第二題:刪括號(未寫)

動態規劃專題

多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解,創立了解決這類過程優化問題的新方法 動態規劃 個人的理解 就是處於當前決策時要依賴前面的已知情況,將看似 連續無統一標準解決方案 的問題分割成多個 可以商量的 的決策過程。商量就是依靠已知的情況覺得未知 那麼什麼問題才可以用到動態規劃...

動態規劃專題

這個題,初學之時,老師教我們用分治演算法,分三路 在左邊子陣列 在右邊子陣列以及跨越中線,其實用動態規劃已經很簡單了,看狀態轉移方程就明白了 dp i beginarr i quad i 0 max quad otherwise end def maximum subarr arr if not a...

動態規劃專題

在 acm 能夠開展之前,必須準備預算,並獲得必要的財力支援。該活動的主要收入來自於 irreversibly bound money ibm 思路很簡單。任何時候,某位 acm 會員有少量的錢時,他將所有的硬幣投入到小豬儲錢罐中。這個過程不可逆,因為只有把小豬儲錢罐打碎才能取出硬幣。在足夠長的時間...