cf414B(dp)
生活随笔
收集整理的這篇文章主要介紹了
cf414B(dp)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:http://codeforces.com/problemset/problem/414/B
?
題意:定義所有元素是其前一個元素的倍數的數列為good sequence,給出 n, 和 k,求1....n組成的長度為k的good sequence 的數目;
?
思路:dp
用dp[i][j]存儲以 j 結尾長度為 i 的good sequence 的數目,那么我們不難發現dp[i][j]可以由dp[i-1][l] (l | j)求和得到,
即狀態轉移方程為:dp[i][j] = Σdp[i-1][l] (l | j);
注意我們可以先打表得到1...n的因子,不然可能會tle;
?
代碼:
1 #include <bits/stdc++.h> 2 #define MAXN 2010 3 #define ll long long 4 using namespace std; 5 6 const int mod=1e9+7; 7 ll dp[MAXN][MAXN]; //dp[i][j]表示以j結尾長度為i的good sequence的數目 8 vector<int>v[MAXN];//v[i]存儲i的因子 9 10 int main(void){ 11 int n, k; 12 cin >> n >> k; 13 for(int i=1; i<=n; i++){ 14 dp[1][i]=1; 15 } 16 for(int i=1; i<=n; i++){//求i的因子 17 for(int j=1; j<=i; j++){ 18 if(i%j==0){ 19 v[i].push_back(j); 20 } 21 } 22 } 23 for(int i=2; i<=k; i++){ 24 for(int j=1; j<=n; j++){ 25 for(int k=0; k<v[j].size(); k++){ 26 dp[i][j]=(dp[i][j]+dp[i-1][v[j][k]])%mod; 27 } 28 } 29 } 30 ll ans=0; 31 for(int i=1; i<=n; i++){ 32 ans=(ans+dp[k][i])%mod; 33 } 34 cout << ans << endl; 35 return 0; 36 } View Code?
轉載于:https://www.cnblogs.com/geloutingyu/p/6556027.html
總結
以上是生活随笔為你收集整理的cf414B(dp)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 递归实现 十进制转换其他进制(2-16)
- 下一篇: 统计字符串中每种字符类型的个数demo