(HDOJ)2044——一隻小蜜蜂...(遞推)
阿新 • • 發佈:2018-12-31
Problem Description
有一隻經過訓練的蜜蜂只能爬向右側相鄰的蜂房,不能反向爬行。請程式設計計算蜜蜂從蜂房a爬到蜂房b的可能路線數。
其中,蜂房的結構如下所示。
Input
輸入資料的第一行是一個整數N,表示測試例項的個數,然後是N 行資料,每行包含兩個整數
a和b (0<a<b <50)
Output
對於每個測試例項,請輸出蜜蜂從蜂房a爬到蜂房b的可能路線數,每個例項的輸出佔一行。
Sample Input
2
1 2
3 6
Sample Output
1
3
Author
lcy
Source
遞推求解專題練習(For Beginner)
問題分析
典型的遞推題,遞推公式:
f(n)=f(n-1)+f(n-2)
前幾個f(1)=1;f(2)=1;f(3)=2….
AC程式碼
#include<iostream>
#include<algorithm>
using namespace std;
long long ans[100];//設定一個儲存計算重複的資料
long long f(int n){
long long answer;
if (n == 1)
return 1;
if (n == 2 )
return 1;
if (n > 2)//如果N>2需要呼叫前面的n-1和n-2進行計算
{
if (ans[n] != -1){//優先檢視是否已經計算過
answer = ans[n];
}
else{//否則遞迴
answer = f(n - 1) + f(n - 2);
ans[n] = answer;//記得將這個遞迴計算的結果寫入到以n為下標的陣列,其他遞推可以在計算時候直接呼叫這個值
}
}
return answer;
}
int main(){
int n, a,b;
cin >> n;
for (int i = 0; i < 100; i++)
ans[i] = -1;//將陣列置為-1
for (int i = 0; i < n; i++){
cin >> a>>b;
cout << f(b-a+1) << endl;
}
return 0;
}
後來我發現自己用的根本不是遞推,而是類似動態規劃,或者說利用遞迴的方式,但是從小到大將資料儲存在陣列中,導致最優解是建立在前面的最優子結構上面而使得程式碼的效率更高,下面給出遞推的方法,更快,更好理解。
#include<stdio.h>
#include<string.h>
int main() {
double ans[110]= {0,0,1,2,3,5};
int a,b,t;
scanf("%d",&t);
for(int j=4; j<=100; j++)
ans[j]=ans[j-1]+ans[j-2];
while(t--) {
scanf("%d%d",&a,&b);
printf("%.0lf\n",ans[b-a+1]);
}
return 0;
}