/* 功能说明: 给定一个非负整数数组,找出最长递增子序列. 作者: hfjiang 完成日期: 2005-3-13 */ #include<iostream> using namespace std; #define GT 1000 #define LT -1000 #define EQ 5000 int max(const int i,const int j,const int T[6][6],const int size); int main() { //int a[6] = {0,5,4,2,1,3}; int a[6] = {0,1,2,3,4,5}; //没考虑数组中有相同元素的情况,其实也超简单 //更多数的,把6换一下就行. //int size = sizeof(a) / 4; int size = 6; int T[6][6]; for(int i = 0;i < size;i++){ for(int j = 0 ; j < size;j++){ T[i][j] = 0; } } //build relation table for( i = 0;i < size;i++){ for(int j = i+1 ; j < size;j++){ if(a[i] > a[j]) T[i][j] = GT; if(a[i] == a[j]) T[i][j] = EQ; if(a[i] < a[j]) T[i][j] = LT; } } for( i = 0;i < size;i++){ cout<<endl; for(int j = 0;j < size;j++){ cout << T[i][j] <<"\t"; } } cout << endl; cout << endl; //dynamic programing for( i = 0;i < size;i++) T[i][i] = 1; for( i = 0;i < size;i++){ for(int j = i+1 ; j < size;j++){ if(T[i][j] == GT) T[i][j] = 0; } } for(i = size-2 ;i >= 0;i--){ for(int j = i+1 ;j < size ;j++){ if(T[i][j] == LT){ //T[i][j] = max{A[j][K]|k=j...size-1}; T[i][j] = max(j,j,T,size) + 1; } } } for( i = 0;i < size;i++){ cout<<endl; for(int j = 0;j < size;j++){ cout << T[i][j] <<"\t"; } } return 0; } int max(const int i,const int j,const int T[6][6],const int size){ /* Return the max value of T[i][j....size-1]; */ int max = T[i][j]; for(int k = j+1;k < size;k++){ max = max < T[i][k] ? T[i][k] : max; } return max; } cost: 0(n^3) 程序设计思想:D.P 1。首先建立关系表:大小偏序关系。只有小于关系能走(上三角矩阵) . 对角线初始化为1. 2. 回溯:从上三角矩阵从下往上找最大值。 3. 上面程序并未给出子序列:只需在最终矩阵中找每行最大对应的元素,即为LIS中元素。 4. 最终可能有多条路径:因为可能存在多个LIS。 D.P 1。首先建立关系表:大小偏序关系。只有小于关系能走(上三角矩阵) . 对角线初始化为1. 2. 回溯:从上三角矩阵从下往上找最大值。 3. 上面程序并未给出子序列:只需在最终矩阵中找每行最大对应的元素,即为LIS中元素。 4. 最终可能有多条路径:因为可能存在多个LIS。 D.P 1。首先建立关系表:大小偏序关系。只有小于关系能走(上三角矩阵) . 对角线初始化为1. 2. 回溯:从上三角矩阵从下往上找最大值。 3. 上面程序并未给出子序列:只需在最终矩阵中找每行最大对应的元素,即为LIS中元素。 4. 最终可能有多条路径:因为可能存在多个LIS。 D.P 1。首先建立关系表:大小偏序关系。只有小于关系能走(上三角矩阵) . 对角线初始化为1. 2. 回溯:从上三角矩阵从下往上找最大值。 3. 上面程序并未给出子序列:只需在最终矩阵中找每行最大对应的元素,即为LIS中元素。 4. 最终可能有多条路径:因为可能存在多个LIS。 Plz enjoy! 
|