1. 程式人生 > >對動態規劃演算法的理解

對動態規劃演算法的理解

一、對動態規劃的理解

  動態規劃思想與分治法類似,都是將問題分解為多個子問題,通過求解子問題來得到最終答案,而動態規劃的優勢在於,動態規劃防止了子問題的重複計算,每個問題只計算一次,自底向上地求出原問題的解。

二、程式設計題1、2的遞迴方程

 第一題

int  max(int *p,int *m,int n){
	int max=0;//用於記錄最長子序列的大小
	for(int i=0;i<n;i++)
		m[i]=1;//子序列長度初始化為1
	for(int i=0;i<n;i++){
		for(int j=0;j<i;j++){
			if((p[i]>p[j])&&(m[i]<m[j]+1)) {
					m[i]=m[j]+1;//選擇最長子序列
		}
		if(m[i]>=max) max=m[i];//記錄最大值
		}
	return max;
}

  m[i]表示以當前位置的值為子序列末位的最長子序列的長度,同時用max篩選出所有長度的最大值

第二題

int cheap(int *p,int *m,int n){
	for(int i=1;i<n;i++)
		for(int j=i+1;j<=n;j++)
			{
				cin>>p[j];
				if(i==1) 
					m[j]=p[j];//初始化m[j]的值
				else
					if(m[j]>(p[j]+m[i]))
						m[j]=p[j]+m[i];//選擇最少租金路徑
			}
	return m[n];		
	

  因為該問題無需分別求出某一層到另一層的最少租金,故僅僅採用一維陣列m[i]表示從第一層到第i層的最少租金,降低了空間複雜度,最終解為m[n]

三、結隊程式設計情況

  本次程式設計我們先各自獨立程式設計,程式設計完成或是遇見困難後,再交流各自的思路並嘗試優化對方的演算法。總體來看,我們的思路基本一致,演算法的時間複雜度一致,但空間複雜度略有差別,通過討論後,我們認為兩種方法都可行,一種更加通用,一種趨向於實際問題的求解,因而我們決定各自保留自己的演算法,不做統一