動態規劃-最長公共子序列
using System;
namespace 最長公共子序列
{
class Program
{
public static readonly string str1 = "abacadba";
public static readonly string str2 = "abcdabcd";
public static int[,] map = new int[str1.Length + 1, str2.Length + 1];
static void Main(string[] args)
{
LCS();
Console.WriteLine("行表示str1,列表示str2:");
DisplayMap();
Console.WriteLine();
DisplayRes();
Console.ReadKey();
}
/// <summary>
/// LCS演算法
/// </summary>
static void LCS()
{
//初始化矩陣內所有元素為0
for (int i = 0; i < str1.Length + 1; i++)
{
for (int j = 0; j < str2.Length + 1; j++)
{
map[i, j] = 0;
}
}
for (int i = 1; i < str1.Length + 1; i++)
{
for (int j = 1; j < str2.Length + 1; j++)
{
//若str1的第i個元素和str2的第j個元素相等 則map[i,j]等於 map中當前單元格左邊或者上面較大的值+1
//若str1的第i個元素和str2的第j個元素不相等 則map[i,j]等於 map中當前單元格左邊或者上面較大的值
if (str1[i - 1] == str2[j - 1])
map[i, j] = Math.Max(map[i - 1, j], map[i, j - 1]) + 1;
else
map[i, j] = Math.Max(map[i - 1, j], map[i, j - 1]);
}
}
}
/// <summary>
/// 顯示LCS演算法運算後的MAP矩陣
/// </summary>
static void DisplayMap()
{
Console.Write(" ");
for (int i = 0; i < str2.Length; i++)
{
Console.Write(" " + str2[i]);
}
Console.Write("\r\n");
for (int i = 0; i < str1.Length + 1; i++)
{
if (i > 0 && i < str1.Length + 1)
Console.Write(str1[i - 1] + " ");
else
Console.Write(" ");
for (int j = 0; j < str2.Length + 1; j++)
{
Console.Write(map[i, j] + " ");
}
Console.Write("\r\n");
}
}
/// <summary>
/// 顯示LCS長度和結果
/// </summary>
static void DisplayRes()
{
Console.WriteLine("str1和str2的最長公共子序列長度是:" + map[str1.Length, str2.Length]);
Console.Write("str1和str2的最長公共子序列是:");
int flag = map[0, 0];
for (int i = 1; i < str1.Length + 1; i++)
{
for (int j = 1; j < str2.Length + 1; j++)
{
if (map[i, j] > Math.Max(map[i - 1, j], map[i, j - 1]) && map[i, j] > flag)
{
Console.Write(str1[i - 1]);
flag = map[i, j];
break;
}
}
}
}
}
}
相關文章
- 動態規劃——最長公共子序列動態規劃
- 動態規劃(最長公共子序列LCS)動態規劃
- 力扣1143. 最長公共子序列 動態規劃之最長公共子序列力扣動態規劃
- 最長公共子序列問題—動態規劃sdut動態規劃
- 動態規劃經典問題----最長公共子序列動態規劃
- 動態規劃之最長公共子序列求解動態規劃
- 詳解動態規劃最長公共子序列--JavaScript實現動態規劃JavaScript
- 動態規劃:最長上升子序列動態規劃
- 最長上升子序列動態規劃動態規劃
- 動態規劃-最長上升子序列模型動態規劃模型
- 【LeetCode動態規劃#14】子序列系列題(最長遞增子序列、最長連續遞增序列、最長重複子陣列、最長公共子序列)LeetCode動態規劃陣列
- 以最長公共子序列問題理解動態規劃演算法(DP)動態規劃演算法
- 淺談最長公共子序列引發的經典動態規劃問題動態規劃
- 動態規劃求解最長上升子序列問題動態規劃
- 動態規劃求最長降序序列動態規劃
- 最長公共子序列
- python 動態規劃(揹包問題和最長公共子串)Python動態規劃
- 最長公共子序列(JAVA)Java
- [動態規劃] 六、最長迴文子串動態規劃
- 北京大學郭煒-最長上升子序列 動態規劃講解動態規劃
- 最長公共子序列求方案數
- java 實現 最長公共子序列Java
- 最長公共子序列 Longest Common Subsequence
- 線性dp:最長公共子序列
- LeetCode 1143.最長公共子序列LeetCode
- LeetCode 300. 最長上升子序列(Python、動態規劃、貪心演算法)LeetCodePython動態規劃演算法
- LeetCode 1626. 無矛盾的最佳球隊---【動態規劃】最長上升子序列變換版-->最大上升子序列和LeetCode動態規劃
- 最長公共子序列LCS 輸出所有LCS
- 51Nod 1006 最長公共子序列Lcs
- 最長公共子序列你學會了嗎
- 雙序列動態規劃動態規劃
- [題解]P1439 【模板】最長公共子序列
- [LeetCode解題] -- 動態規劃二 [ 子串、子序列問題 ]LeetCode動態規劃
- 字串篇(python)—兩個字串的最長公共子序列字串Python
- 51nod-基因匹配+luogu-【模板】最長公共子序列
- 動態規劃之子序列問題動態規劃
- lCS(最長公共子串)
- 最長上升子序列