最長遞增子串行問題的求解
最長遞增子串行問題是乙個很基本、較常見的小問題,但這個問題的求解方法卻並不那麼顯而易見,需要較深入的思考和較好的演算法素養才能得出良好的演算法。由於這個問題能運用學過的基本的演算法分析和設計的方法與思想,能夠鍛鍊設計較複雜演算法的思維,我對這個問題進行了較深入的分析思考,得出了幾種複雜度不同演算法,並給出了分析和證明。
一, 最長遞增子串行問題的描述
設l=
public
void
lis(float l)
}system.out.println(f[n-1]);
}
這個演算法有兩層迴圈,外層迴圈次數為n-1次,內層迴圈次數為i次,演算法的時間複雜度
所以t(n)=o(n2)。這個演算法的最壞時間複雜度與第一種演算法的階是相同的。但這個演算法沒有排序的時間,所以時間複雜度要優於第一種演算法。
四, 對第二種演算法的改進
在第二種演算法中,在計算每乙個f(i)時,都要找出最大的f(j)(j
lis1(float l)
b[p] = l[i];//將長度為p的最大遞增子串行的當前最末元素置為ai+1;
if(p>len) len++;//更新當前最大遞增子串行長度;
}system.out.println(len);
}
現在來證明這個演算法為什麼是正確的。要使演算法正確只須證如下命題:
命題1:每一次迴圈結束陣列b中元素總是按遞增順序排列的。
證明:用數學歸納法,對迴圈次數i進行歸納。
當i=0時,即程式還沒進入迴圈時,命題顯然成立。
設i
最長遞增子串行求解
演算法難,難於上青天 搞懂乙個演算法不容易,還是寫篇部落格為以後複習做好準備 include define n 1000 using namespace std int getlongcommonsub int a 6 int dp 6 int n return dp i 1 int main in...
最長遞增子串行問題的求解
最長遞增子串行問題的求解 最長遞增子串行問題是乙個很基本 較常見的小問題,但這個問題的求解方法卻並不那麼顯而易見,需要較深入的思考和較好的演算法素養才能得出良好的演算法。一,最長遞增子串行問題的描述 設l 是n個不同的實數的序列,l的遞增子串行是這樣乙個子串行lin 其中k1是對序列l 按遞增排好序...
zz 最長遞增子串行的求解
什麼是最長遞增子串行呢?問題描述如下 設l 是n 個不同的實數的序列,l的遞增子串行是這樣乙個子串行 lin 其中k1且 ak1。求最大的m值。對於這個問題有以下幾種解決思路 1 把a1,a2,an 排序,假設得到 a 1,a 2,a n 然後求a的 a 的最長公共子串,這樣總的時間複雜度為 o n...