題:給定乙個長度為n的陣列,找出乙個最長的單調自增子序列(不一定連續,但是順序不能亂) 例如:給定乙個長度為8的陣列a,則其最長的單調遞增子串行為,長度為6。
思路1:第一眼看到題目,很多人肯定第一時間想到的是lcs。先給陣列排個序形成新陣列,然後再把新陣列和原陣列拿來求lcs,即可得到答案。這種解法很多人能想得到,所以就不再贅述。
思路2:按照思路1的想法,最後求lcs時還是得用到dp,我們幹嘛不直接用dp來求解呢。對於陣列arr,我們從後往前遍歷陣列,分別求出當子串行以arr[i]結尾時的最長子序列,然後取其中的最大值。即可得到整個陣列的最長子序列。 那麼怎麼求以arr[i]結尾時的最長子序列呢,這就轉換成乙個dp問題了。要求arr[i]的最長子序列,只需要求出arr[i-1]的最長子序列。即:max=max+1。
**:
public
static
void
main(string args);
int arr = ;
// int arr = ;
int max = 0;
int maxlen = arr.length;
// 從後往前遍歷陣列,分別求出以arr[i]結尾的時候的最長子序列長度
for(int i = arr.length-1; i > 0; i--)
system.out.println(max);
}public
static
intdp(int arr, int end)
// 遍歷陣列,找到最靠近end的並且<=end的元素位置i
for(int i=arr.length-1; i>=0; i--)
}// 如果沒找到比end更小的,返回長度為0
return
0; }
我的方法由於中間開闢了多個新陣列,可能占用的空間有點多,不過我覺得應該也不是很多- -,具體我也沒統計過。如果有不對的地方還請指正。 最長子序列
最長子序列可以說是剛接觸動態規劃的人經常遇見也不得不解決的問題,最常見的有兩種,一種是最長公共子串行 lcs 還有乙個是最長上公升子串行 lis 今天我就總結下這兩個的做法。一 最長公共子串行 lcs 題目描述 給你兩個陣列,可以是數字的,也可以是字串,我們假設是數字的!舉個例子 x 1,5,6,4...
最長子序列
在做oj題目的時候,經常會用到字串的處理。例如,比較二個字串相似度。這篇文章介紹一下求兩個字串的最長公共子串行。乙個字串的子串行,是指從該字串中去掉任意多個字元後剩下的字元在不改變順序的情況下組成的新字串。最長公共子串行,是指多個字串可具有的長度最大的公共的子串行。include includech...
最長子序列
include include includeusing namespace std int f char x,char y return max f x 1,y f x,y 1 int main 乙個串的子串是指該串的乙個連續的區域性。如果不要求連續,則可稱為它的子串行。比如對串 abcdefg ...