zoj4011 動態規劃

2021-08-19 05:07:52 字數 763 閱讀 3328

給定乙個n,m,要求乙個m為長度,並且從第一項起有b[i+1]%b[i]==0的數列,求出組合個數(1<=b[i]<=n)

利用dp來做,陣列dp[i][j]表示在長度為i時,以j為結尾的數列,邊界條件為dp[1][i]=1,因為當長度為1時,以i為結尾的數列只有乙個。轉移方程為dp[i][k]=d[i][k]+dp[i-1][j]   (k==a*j)

首先,迴圈條件為 k=j;k<=n;k+=j 因此k=a*j  ,dp[i][k]就是在長度為i,以k為結尾的數列,那麼除了自己的個數以外,還有當長度為i-1,結尾為j的數列的個數dp[i-1][j],因為當k放入第i個位置的時候,且k=a*j,那麼我們就變成了dp[i][k],因此兩個加上就是長度為i,結尾為k的數列的個數dp[i][k];

最後求長度為m,以1-n為結尾的個數就直接sum+=dp[m][i](1<=i<=n),記得取模就可以了

#include #include #include #include #include using namespace std;

const int mod=1e9+7;

long long dp[2009][2009];

//dp[i][j]表示在長度為i,以j結尾的數列的個數

int main()

for(i=2; i<=m; i++)}}

long long ans=0;

for(i=1; i<=n; i++)

printf("%lld\n",ans);

}}

zoj 動態規劃幾題(簡單)

1092 floyd 拼的對麼。就是算環的最大長度能否到1啦 include include include include using namespace std char a 1000 100 double b 100 100 char q 100 w 100 int m int qqq if ...

ZOJ1093 動態規劃

給你n磚,有三個長寬高。每乙個無限制的訪問。疊加在乙個條件的長度和寬度必須嚴格格長度和寬度大於下面的乙個,疊加求最大高度。思維 每塊磚終於放置在根據本方法可以把六種,然後,對於長度和寬度排序。這是lis的變化的問題 include include include include include in...

動態規劃 什麼是動態規劃?

先來看看 資訊學奧賽一本通第5版 是怎麼說的 動態規劃程式設計是對解最優化問題的一種途徑 一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有乙個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,...