求解買股票問題實驗報告(DP + LDS)

再次水一發題。。

一、 實驗目的

  1. 加深對最長公共子序列問題算法的理解,實現最長公共子序列問題的求解算法;
  2. 通過本次試驗掌握將算法轉換爲上機操作;
  3. 加深對動態規劃思想的理解,並利用其解決生活中的問題。

二、實驗內容

任務:求解買股票問題

“逢低吸納”是炒股的一條成功祕訣。如果你想成爲一個成功的投資者,就要遵守這條祕訣:
"逢低吸納,越低越買"這句話的意思是:每次你購買股票時的股價一定要比你上次購買時的股價低.按照這個規則購買股票的次數越多越好,看看你最多能按這個規則買幾次。
給定連續的N天中每天的股價。你可以在任何一天購買一次股票,但是購買時的股價一定要比你上次購買時的股價低。寫一個程序,求出最多能買幾次股票。
以下面這個表爲例, 某幾天的股價是:
天數 :1 2 3 4 5 6 7 8 9 10 11 12
股價 :68 69 54 64 68 64 70 67 78 62 98 87

三、實驗原理

首先本題就是求最長下降子序列的問題:巧妙利用動態規劃思想
  1. 原序列數組a
  2. dp[i]代表前i個數的最長下降子序列長度
  3. 動態維護一個dp[i]數組,若i位置之前j處有比當前大的數則更新當前爲dp[i] = max(dp[i], dp[j] + 1);
  4. 使用res來獲得dp數組的最大值,即最終結果!

四、程序代碼

解釋:LDS函數爲最長下降子序列函數,動態維護dp數組的值,返回dp中的最大值,爲最終結果。
代碼如下:

#include <iostream>

using namespace std; 

const int N = 1e6;
int a[N], dp[N], n;

int LDS()
{
    int res = 0;

    for(int i = 0; i < n; i++)
    {
        dp[i] = 1;
        for(int j = 0; j < i; ++j)
            if(a[j] > a[i]) dp[i] = max(dp[i], dp[j] + 1);
        res = max(res, dp[i]);
    }
    return res;
}

int main()
{
	cin >> n;
	for(int i = 0; i < n; i++) cin >> a[i];
	cout << LDS() << endl; 
	return 0;
}

五、實驗結果

測試一:
在這裏插入圖片描述

測試二:

在這裏插入圖片描述

六、分析總結

  1. 動態規劃(Dynamic programming,簡稱 DP)是一種在數學、管理科學、計算機科學、經濟學和生物信息學中使用的,通過把原問題分解爲相對簡單的子問題的方式求解複雜問題的方法。
  2. 動態規劃常常適用於有重疊子問題和最優子結構性質的問題,動態規劃方法所耗時間往往遠少於樸素解法。動態規劃背後的基本思想非常簡單。大致上,若要解一個給定問題,我們需要解其不同部分(即子問題),再根據子問題的解以得出原問題的解。
  3. 通過本次實驗學習並瞭解掌握了最長下降子序列的求解,思路及解法,動態的維護一個數組,最終的最大值就是所求的答案。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章