1. 程式人生 > >演算法訓練 K好數 藍橋杯

演算法訓練 K好數 藍橋杯

對於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;
}