動態規劃 最長上公升字串問題

2021-10-04 23:04:03 字數 1395 閱讀 6587

首先定義上公升字串,對於任意的0這道題首先想到利用動態規劃的思路,動態規劃的基本思想就是:

問題的最優解如果可以由子問題的最優解推導得到,則可以先求解子問題的最優解,在構造原問題的最優解;若子問題有較多的重複出現,則可以自底向上從最終子問題向原問題逐步求解。

因此這道題可以理解成兩個問題:

在已知前n-1個單詞的最長上公升字串組合的情況下,尋找第n個字串和前n-1個字串構成的最長上公升字串的最長上公升字串問題。

保證前n-1個字串構成的最長上公升字串長度一定小於等於前n個字串構成的最長上公升字串長度。

首先解決字串排序問題,要保證前n-1個字串構成的最長上公升字串長度一定小於等於前n個字串構成的最長上公升字串長度,需要讓首字元小的字串排在前面,另外要考慮"aaa"和「abb」比較時要讓「aaa」排在前面。所以**中除了使用快排對字串陣列進行排序外,還用bigger函式進行了比值判斷。

其次尋找最長上公升字串的過程中使用了history陣列來記錄前n-1個字串在n-1次求解過程中所能組成最長上公升字串的長度。

public class longestascstring else if (a[0] < b[0])else else }}

/*** 對字串陣列進行快排

* @param s

* @return

*/public static string sortfirst(string s, int low, int high)

s[low] = s[high];

while (!bigger(clow,ctmp) && low < high)

s[high] = s[low];

}s[low] = tmp;

sort(s, start, low-1);

sort(s, low+1, stop);

return s;

}else

}/**

* 找到每一單詞前最長的ascstring

* @param s

* @return

*/public static int longest(string s)

}for (int j = 0; j < i; j++)

history[i] = history[j]+si.length;}}

}return max;

}public static void main(string args);

for (string a : sortfirst(s, 0, s.length-1))

system.out.println(longest(s));

}}

動態規劃 最長上公升字串 詞語接龍問題

def bfs arr,ajmatrix max length 0for i in range len arr 每乙個單詞都有可能被當作開頭 記錄遍歷過的單詞 history 以第i個單詞作為開頭 cur max 0 初始化以第i個單詞為開頭的最大長度 queue i,len arr i histo...

動態規劃 最長上公升子串行問題

原文 主題 動態規劃 最長上公升子串行問題,也就是longest increasing subsequence,縮寫為lis。是指在乙個序列中求長度最長的乙個上公升子串行的問題,是動態規劃中乙個相當經典問題。在這裡我們可以看到,這個上公升實質上就是乙個對 進行定義的過程,所以我們求解的其實是一類問題...

最長上公升子串行問題(動態規劃)

乙個數的序列bi,當b1 n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8 等等。這些子串行中最長的長度是4,比如子串行 1,3,5,8 你的任務,就是對於給定的序列,求出最長上公升子串行的長度。輸入輸入的第一行是序列的長度n 1 n 1000 第二行給...