演算法訓練 K好數 藍橋杯
阿新 • • 發佈:2019-02-14
對於30%的資料,KL <= 106;
對於50%的資料,K <= 16, L <= 10;
對於100%的資料,1 <= K,L <= 100。
本身想用搜索,然後資料太大了,看了提示,要用動態規劃。
也不能算典型的動態規劃,因為不存在最優子結構,只是用了重複利用子問題的思想。
具體思路是建立一張表格,i表示最後一位數字是i,j表示j位數,先填j=1的那一列,然後j=2的每個元素等於j=1的元素累加,再除去最後兩位相鄰的情況,以此類推。
由於只用前面一列的資料,所以設立滾動陣列,只需要2*K的空間。
相對於搜尋,需要K的L次冪時間,用動態規劃只需要解決K*L個子問題所需的時間。
#include<stdio.h> #define min(a,b) a<b?a:b int main(){ int i,j,k,e; long long K,L,q=0; long long a[1500][2]={0}; scanf("%lld%lld",&K,&L); e=0; for(i=0;i<K;i++) a[i][e]=1; for(j=2;j<=L;j++){ e=1-e; for(i=0;i<K;i++){ a[i][e]=0; } for(i=0;i<K;i++){ for(k=0;k<K;k++){ if(k==i-1||k==i+1)continue; a[i][e]+=a[k][1-e]; a[i][e]%=1000000007; } } } for(i=1;i<K;i++){ q+=a[i][e]; q%=1000000007; } printf("%lld",q); return 0; }