例一:有一段樓梯有10級台階,規定每一步只能跨一級或兩級,要登上第10級台階有幾種不同的走法?
1 #include 2 #include3 #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:
差不多的道理
注意什麼是序列,求的是什麼
#includeusingnamespace
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 會員有少量的錢時,他將所有的硬幣投入到小豬儲錢罐中。這個過程不可逆,因為只有把小豬儲錢罐打碎才能取出硬幣。在足夠長的時間...