1 #include 2 #include 3 #include 4using
namespace
std;
5char str1[55], str2[55];6
int f[55][55];//
記錄狀態 7//
動態規劃是一種記憶化搜尋 8/*
有倆個字串,求出他們的最長公共子串行
9,例如:
10acdtfs
11aldtks
12最長公共子串行是adts,長度為4
13n,m
14string1(length = n)
15string2(length = m)
16f[i][j]表示1串第i個與第二個串第j個匹配得到
17的子串行最大長度
18f[i][j] = max(f[i - 1][j], f[i][j - 1]);
19f[i - 1][j - 1] + 1;
20*/
21int
main()
32 f[i][j]=max(f[i][j], f[i-1
][j]);
33 f[i][j]=max(f[i][j], f[i][j-1
]);
34} 35}
36 printf("
%d\n
", f[n][m]);
37return0;
38 }
1 #include 2using
namespace
std;3/*
有一串數,求出它的最大不下降子串行的
4長度(等於也包括)
5如1, 2, 5, 3, 6, 2, 9, 10
6答案是
71 2 3 6 9 10(這只是其中之一)
8f[i]表示子串行包括數字i的時候,最長不下降子串行的長度
9f[i] = max(f[j] + 1) a[i] > a[j];
10ans = max(f[i])
11*/
12int a[222
];13
int f[222
];14
int memory[222];//
記錄狀態
15int
main()
22int
temp;
23 f[1] = 1;//
第乙個為1
24for(i = 2; i <= n; i++)
32} 33}
34}35int ans = 0, mark;//
mark用來取得記錄最大不下降子串行的下標,ans用來記錄大子串行的值
36for(i = 1; i <= n; i++) 41}
42 temp =mark;
43//
倒序輸出記錄狀態 (這裡可以利用乙個棧順序輸出)
44while(temp > 0
)48 printf("
\n%d\n
", ans);
49return0;
50 }
最長公共子串行的優秀博文:
最長共公子序列 LCS
1 include 2 include 3 include 4 using namespace std 5char str1 55 str2 55 6 int f 55 55 記錄狀態 7 動態規劃是一種記憶化搜尋 8 有倆個字串,求出他們的最長公共子串行 9,例如 10acdtfs 11aldtk...
最長子序列LCS演算法
問題描述 給定兩個序列x,y,求這兩個序列的最長公共子串行 主要思想 動態規劃 解析 子串行 即序列中,下標按照嚴格遞減所形成的序列即為子串行,比如 x 那麼 acb也是該序列的子串行 子串行可以有很多,但是最長子序列的長度是應該唯一的。推論 1 如果xi yj,那麼zk xi yj,則zk 1 x...
LCS 最長公共子串行
問題描述 我們稱序列z z1,z2,zk 是序列x x1,x2,xm 的子串行當且僅當存在嚴格上 公升的序列 i1,i2,ik 使得對 j 1,2,k,有 xij zj。比如z a,b,f,c 是 x a,b,c,f,b,c 的子串行。現在給出兩個序列 x和 y,你的任務是找到 x和 y的最大公共子...