【編程練習】動態規劃常規題目(經典常考重點)

1 連續子數組和
時間限制:1秒 空間限制:32768K 熱度指數:253787
本題知識點: 數組

題目描述
HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全爲正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如:{6,-3,-2,7,-15,1,2,2},連續子向量的最大和爲8(從第0個開始,到第3個爲止)。給一個數組,返回它的最大連續子序列的和,你會不會被他忽悠住?(子向量的長度至少是1)

int FindGreatestSumOfSubArray(vector<int> array) {
        int current=array[0];
        int max=array[0];
        for(int i=1;i<array.size();++i)
        {
            current+=array[i];
            if(current<array[i])
                current=array[i];
            if(max<current)
                max=current;
        }
        return max;
    }

2 最長公共子序列的長度

int maxLCS(string s1,string s2 )
{
	i==s1.size();
	j=s2.size();
	int temp1, temp2;
    if(i==0 || j==0)
        return 0;
    if(s1[i]==s2[j])
        return maxLCS(i-1,j-1)+1;
    temp1=maxLCS(i-1,j); 
    temp2=maxLCS(i,j-1);
    return temp1>temp2?temp1:temp2;
}

3 最長遞增子序列問題

設L=<a1,a2,…,an>是n個不同的實數的序列,L的遞增子序列是這樣一個子序列Lin=<aK1,ak2,…,akm>,其中k1<k2<…<km且aK1<ak2<…<akm。求最大的m值。

(1)設序列X=<b1,b2,…,bn>是對序列L=<a1,a2,…,an>按遞增排好序的序列。那麼顯然X與L的最長公共子序列即爲L的最長遞增子序列。這樣就把求最長遞增子序列的問題轉化爲求最長公共子序列問題LCS了。

(2)在求以ai爲末元素的最長遞增子序列時,找到所有序號在L前面且小於ai的元素aj,即j<i且aj<ai。如果這樣的元素存在,那麼對所有aj,都有一個以aj爲末元素的最長遞增子序列的長度f(j),把其中最大的f(j)選出來,那麼f(i)就等於最大的f(j)加上1,即以ai爲末元素的最長遞增子序列,等於以使f(j)最大的那個aj爲末元素的遞增子序列最末再加上ai;如果這樣的元素不存在,那麼ai自身構成一個長度爲1的以ai爲末元素的遞增子序列。

int lis(float[] L)
{
         int n = L.length;
         int[] f = new int[n];                    //用於存放f(i)值;
         f[0]=1;                     //以第a1爲末元素的最長遞增子序列長度爲1;
         for(int i = 1;i<n;i++)                 //循環n-1次
         {
                f[i]=1;                          //f[i]的最小值爲1;
                for(int j=0;j<i;j++)             //循環i 次
                {
                       if(L[j]<L[i]&&f[j]>f[i]-1)
                              f[i]=f[j]+1;               //更新f[i]的值。
                }
         }
         return f[n-1];            
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章