方法一 轉化為lcs最長公共字串
方法二 動態規劃
方法三 陣列+二分查詢
方法一對單調遞增的子串行x排序得到子串行y,然後求子序列x與子串行y的最長公共字串
方法二 動態規劃
1. 先準備乙個陣列b b[i]=1
2. b[i]=max(b[i],b[j]+1); arr[j]動態規劃時間複雜度o(n^2)
/**
* 最長公共子串行 時間複雜度o(n^2)
* @param arr
* @return
*/public static int longestincreasingsubsequence(int arr)
}return max;
}public static void main(string args) ;
int i = longestincreasingsubsequence(arr);
system.out.println(i);
}
方法三
陣列+二分查詢的核心思想: 陣列記錄中間元素,二分查詢每次查詢比當前大的第乙個元素,並替換.
動態規劃 時間複雜度o(nlogn)
**
public static int lis(int array) else
}return len;
}//修改的二分查詢演算法,返回陣列元素需要插入的位置。
public static int bisearch(int b, int len, int w)
return left;//陣列b中不存在該元素,則返回該元素應該插入的位置
}public static void main(string args) ;
int lis = lis(array);
system.out.println(lis);
}
參考文獻
時間複雜度o(nlogn)
最長單調遞增子串行
單調子串行包含有單調遞增子串行和遞減子串行,不失一般性,這裡只討論單調遞增子串行。首先,從定義上明確我們的問題。給定序列a1,a2,an,如果存在滿足下列條件的子串行 ai1 ai2 aim,其中i1即稱為乙個原序列的長度為m的單調遞增子串行,那麼,現在的問題是我們要找出乙個序列的最長的單調遞增子串...
單調遞增最長子序列
時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 求乙個字串的最長遞增子串行的長度 如 dabdbf最長遞增子串行就是abdf,長度為4 輸入第一行乙個整數0 輸出輸出字串的最長遞增子串行的長度 樣例輸入 3 aaaababc abklmncdefg 樣例輸出 1 37 經典題...
單調遞增最長子序列
時間限制 3000 ms 記憶體限制 65535kb 難度 4 描述 求乙個字串的最長遞增子串行的長度 如 dabdbf最長遞增子串行就是abdf,長度為4 輸入 第一行乙個整數0 隨後的n行,每行有乙個字串,該字串的長度不會超過10000 輸出 輸出字串的最長遞增子串行的長度 樣例輸入 3 aaa...