【蓝桥杯官网试题 - 算法训练 】K好数(线性dp与优化)
生活随笔
收集整理的這篇文章主要介紹了
【蓝桥杯官网试题 - 算法训练 】K好数(线性dp与优化)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題干:
問題描述
如果一個自然數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。
解題報告:
? ?這題數據量比較小,可以隨便搞(我寫了個O(n*k*k)的),其實注意到當前狀態只和上一層的兩個值有關系,所以復雜度可以優化到O(n*k)。(%syt大佬)
? ?不過如果n和k都是1e6,這題還可以做嗎?
AC代碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define ll long long #define pb push_back #define pm make_pair using namespace std; const int MAX = 2e2 + 5; const ll mod = 1000000007; ll dp[MAX][MAX]; int main() {int k,n;cin>>k>>n;for(int i = 1; i<k; i++) dp[1][i]=1;for(int i = 2; i<=n; i++) {for(int j = 0; j<k; j++) {for(int l = 0; l<k; l++) {if(abs(j-l) == 1) continue;dp[i][j] = (dp[i][j] + dp[i-1][l])%mod;}}}ll ans = 0;for(int i = 0; i<k; i++) {ans = (ans + dp[n][i])%mod;}printf("%lld\n",ans);return 0 ;}優化:
總結
以上是生活随笔為你收集整理的【蓝桥杯官网试题 - 算法训练 】K好数(线性dp与优化)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2017年信用卡申请排名:最好申请信用卡
- 下一篇: 【2019浙江省赛 - J】Welcom