設序列x=是對序列l=按遞增排好序的序列。
那麼顯然x與l的最長公共子串行即為l的最長遞增子串行。
這樣就把求最長遞增子串行的問題轉化為求最長公共子串行問題lcs了。
最長遞增子串行 lis
設陣列長度不超過 30
quicksort + lcs
#include using namespace std;
void swap(int * arr, int i, int j)
void qsort(int * arr, int left, int right)
} swap(arr,index,left);
qsort(arr,left,index-1);
qsort(arr,index+1,right);
}int dp[31][31];
int lcs(int * arr, int * arrcopy, int len)
else if(dp[i-1][j] > dp[i][j-1])
else
}} return dp[len][len];
}void main()
; int arrcopy [sizeof(arr)/sizeof(int)];
memcpy(arrcopy,arr,sizeof(arr));
qsort(arrcopy,0,sizeof(arr)/sizeof(int)-1);
/* 計算lcs,即lis長度 */
int len = sizeof(arr)/sizeof(int);
printf("%d\n",lcs(arr,arrcopy,len));
}
最長遞增序列
面試題 17.08.馬戲團人塔 原題鏈結 有個馬戲團正在設計疊羅漢的表演節目,乙個人要站在另一人的肩膀上。出於實際和美觀的考慮,在上面的人要比下面的人矮一點且輕一點。已知馬戲團每個人的身高和體重,請編寫 計算疊羅漢最多能疊幾個人。示例 height.length weight.length 1000...
最長公共子串行 最長遞增子串行 最長遞增公共子串行
求最長公共子串行 int dp maxn maxn int a maxn b maxn int main else dp i j max dp i 1 j dp i j 1 printf d n dp m n return 0 輸出最長公共子串行 int dp maxn maxn int d max...
最長遞增子串行
這是微軟實習生筆試遇到的,題意 求乙個陣列中最長遞增子串行的長度。要求選擇該題最好演算法的時間複雜度和空間複雜度。答案 時間複雜度o nlgn 空間複雜度o n 這題明顯用動態規劃來解。假設在目標陣列array 的前i個元素中,以array i 元素為最大元素的遞增子串行的長度是lis i 那麼 遞...