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];
}