動態規劃演算法中的兩種思想

2021-09-23 06:25:32 字數 1731 閱讀 5948

首先是簡單學習了一下動態規劃中的兩種思想:

1  自頂向下備忘錄    2  自底向上

然後在此基礎上面,針對菲波那切數列進行試驗(之後再實現一下,這類演算法的其他經典情景)。

這裡定義了一些函式:

前面兩個函式是用來實現自頂向下,最後乙個實現自底向上。

具體實現如下:

#define _crt_secure_no_deprecate 

/* vs2010 error

scanf的宣告在vs中被認為是不安全的,讓你使用scanf_s來代替。只要在#include 前面新增

#define _crt_secure_no_deprecate

*/#include#include#includeint getthefabonacci(int number);

int fib(int number , int *temp);

int thesecondway(int thenumber);

////int getthefabonacci(int number)

//// if(number == 1 )

// // return getthefabonacci(number - 1) + getthefabonacci(number - 2);

//} //採用動態規劃的方式 之一 : 自頂向下的備忘錄法 -- 可以利用陣列,來儲存相應的數值,減少計算次數

int getthefabonacci(int number)

/*合法的情況下面,可以建立陣列

這裡採用malloc 動態記憶體分配的方式進行陣列的建立*/

temp = (int *)malloc((number+1) *sizeof(int)); //向系統請求一定記憶體的空間 number + 1

/* 然後分別賦值 為 -1 或者一些特殊數值*/

for(i = 0 ; i<= number ; i++)

// memset(temp,0,number);

return fib(number, temp); //呼叫

}int fib(int number , int *temp)

if(number <= 2)

else

return temp[number];

}// the second way

int thesecondway(int thenumber)

// 首先根據thenumber 的大小 進行相應的位址劃分

temp = (int *) malloc((thenumber + 1 )*sizeof(int));

temp[0] = 0;

temp[1] = 1;

// 剩下的資料就是動態的根據thenumber的資料大小進行計算

for (i =2 ; i<= thenumber ; i++)

return temp[thenumber];

}int main()

getchar();

printf("當前的菲波那切數列的總和為 : [ %d ] \n", getthefabonacci(thenumber));

printf("驗證資料為 : [ %d ]\n",thesecondway(thenumber));

} return 0;

}

通過觀察執行結果,可以發現這兩種效率更高一些。

學習參考部落格:

0 1揹包問題的兩種動態規劃演算法思想

name 0 1揹包問題的兩種動態規劃演算法思想 author 巧若拙 date 07 03 17 15 30 description 給定n中物品和乙個容量為c的揹包,物品i的重量為wi,其價值為vi,0 1揹包問題是如何選擇裝入揹包的物品 物品不可分割 使得裝入揹包的物品的價值為最大。1.題目分...

動態規劃演算法的基本思想 演算法 動態規劃

演算法 動態規劃 首先學習動態規劃,我們要先知道什麼是動態規劃?演算法導論這本書是這樣介紹這個演算法的,動態規劃與分治方法類似,都是通過組合子問題的解來來求解原問題的。再來了解一下什麼是分治方法,以及這兩者之間的差別,分治方法將問題劃分為互不相交的子問題,遞迴的求解子問題,再將它們的解組合起來,求出...

動態規劃演算法

一 動態規劃演算法原理 將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後從這些子問題的解得到原問題的解 對於重複出現的子問題,只在第一次遇到的時候對它進行求解,並把答案儲存起來。了不去求解相同的子問題,引入乙個陣列,把所有子問題的解存於該陣列中,這就是動態規劃所採用的基本方法。動態規劃...