首先定義上公升字串,對於任意的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 第二行給...