動態規劃入門階

2021-08-16 08:27:58 字數 1211 閱讀 1578

今天開始重新學習動態規劃!

首先,什麼是動態規劃?簡單來說是求解過程中最優化的數學方法。適用於的題型是可以把多階段過程轉化為一系列單階段問題來求解的問題。這一系列單階段之間存在遞推關係,從而從頭部至尾部每次都選擇最優化解決方案從而最後得到最優化方案。首先以乙個簡單的題來開始。

藍橋杯往年試題:

演算法訓練 k好數  

時間限制:1.0s   記憶體限制:256.0mb

問題描述

如果乙個自然數n的k進製表示中任意的相鄰的兩位都不是相鄰的數字,那麼我們就說這個數是k好數。求l位k進製數中k好數的數目。例如k = 4,l = 2的時候,所有k好數為11、13、20、22、30、31、33 共7個。由於這個數目很大,請你輸出它對1000000007取模後的值。

輸入格式

輸入包含兩個正整數,k和l。

輸出格式

輸出乙個整數,表示答案對1000000007取模後的值。

樣例輸入

4 2樣例輸出 7

資料規模與約定

對於30%的資料,kl

<= 106;

對於50%的資料,k <= 16, l <= 10;

對於100%的資料,1 <= k,l <= 100。

思路:直接入手,要求從第一位開始填數,滿足條件的情況下第l(即最後一)位填好後,所有滿足條件的方案個數。

在此,假設dp[i][j]代表第 i 位填數 j 時的最多方案個數,那麼dp[i][1]+dp[i][2]+……+dp[i][k-1]取模後即為

本題所求。

首先,初始化dp[1][1~k-1]=1(第一位填數的k-1種可能),然後類推dp[2~l][1~k-1]的結果。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

typedef long long ll;  

using namespace std;  

const int mod = 1000000007;  

int dp[110][110]; 

int main()

}s=0;

for(int i=1;i

cout<}

動態規劃入門

1 用 dp 做的題大多數返回值是int boolean,求max min,不能打亂原來輸入順序。2 動態規劃有兩個重要定義,乙個叫 optimal substructure 另乙個叫 overlap subproblem 各種排序 tree 類問題中,都會用到 divide conquer 的思想...

動態規劃入門

大家可以看看這篇文章dp,哪個更容易理解就看哪個!一 動態規劃的定義 動態規劃程式設計是一種針對於解決最優化問題的一種途徑 一種方法,而不是一種特殊演算法,也就是說它沒有固定的模板。在動態規劃中,每走一步都要看看能不能最優,而且動態規劃最擅長的就是多階段問題!二 動態規劃的基本概和基本模型構成 1....

動態規劃入門

學動態規劃自然要從數字三角形開始起步,那麼我們就先從數字三角形開始。數字三角形題目 有乙個由非負整數組成的三角形,第一行只有乙個數,除了最下行之外的每個數的左下方和右下方各有乙個數,如下圖所示 3 24 10 1 4 3 2 20 從第一行的數開始,每次可以往下或往右下走一格,直到走到最下行,把沿途...