第三章實驗報告
阿新 • • 發佈:2021-10-31
1.1 問題描述:
給定n個整數(可能為負數)組成的序列a[1],a[2],a[3],…,a[n],求該序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。當所給的整數均為負數時,定義子段和為0。
要求演算法的時間複雜度為O(n)。
1.2 演算法描述:
#include<bits/stdc++.h> using namespace std; int dp(int A[],int n){ int dp=0; int max=0; for(int i=0;i<n;i++){ if(dp>=0){ dp=dp+A[i]; } else{ dp=A[i]; } if(dp>max){ max=dp; } } return max; } int main(){ int n,i; int a[1000]={0}; cin>>n; for(i=0;i<n;i++){ cin>>a[i]; } cout<<dp(a,n)<<endl;return 0; }
1.3 問題求解:
1.3.1 根據最優子結構性質,列出遞迴方程式:
a[i] d[i+1]<=0;
d[i]= a[i]+d[i+1] d[i+1]>=0;
1.3.2 給出填表法中表的維度、填表範圍和填表順序:
一維陣列
填表順序為d[i]-->d[1]
從右往左
1.3.3 分析該演算法的時間和空間複雜度:
時間複雜度為O(n)
空間複雜度為O(n)
1.4 心得體會:
通過這次實驗我明白了動態規劃的思路,與之前學過的分治法類似,也是將問題劃分為若干個子問題,這時對D[n]的理解就很關鍵,也許一些簡單問題根據生活常識可以沒有章法的程式設計出來,但在面臨一些複雜問題時還是需要我們有動態規劃的思想來解決,通過對問題結構的分析,理清思緒,才能更容易著手。