1. 程式人生 > 其它 >第三章實驗報告

第三章實驗報告

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]的理解就很關鍵,也許一些簡單問題根據生活常識可以沒有章法的程式設計出來,但在面臨一些複雜問題時還是需要我們有動態規劃的思想來解決,通過對問題結構的分析,理清思緒,才能更容易著手。