동적 계획: 사례 설명
( , ), , , 。
: , , , 。
예 를 들다
【 】
, a[],b[], z[]
:
(1)a b (a[m] == b [n]) , , z (“z[0]...z[k-1]” a[m-1] b [n-1] )。
(2) a b (a[m] != b [n]) ,
z[k]!=a[m], “z[0]...z[k-1]” a[m-2] b[n-1]
z[k]!=b[m], “z[0]...z[k-1]” a[m-1] b[n-2]
,
ab ,
a[m] == b [n] a[m-1] b[n-1] 。
(a[m-2] b[n-1]) L1, (a[m-1]h b[n-2]) L2, L1 L2 , 。
프로 그래 밍
( )
c[i][j] a[i] b[j] LCS
d[i][j] c[i][j] (-1,0,1 、 、 )
a b m,n
a[m] == b[n], c[m,n] = c[m - 1, n -1] + 1;(i--,j--)
a[m] != b[n], c[m,n] = max{c[m,n - 1], c[m - 1, n]}; ( c[i,j-1]>=c[i-1,j] j--, i--;)
,i j index, m,n , i = 0,j = 0
성명: 아래 내용 은 네트워크 에서 인용 합 니 다.
실행 코드
#include
#include
#define MAXLEN 100
void LCSLength(char *x, char *y, int m, int n, int c[][MAXLEN], int b[][MAXLEN])
{
int i, j;
for(i = 0; i <= m; i++)
c[i][0] = 0;
for(j = 1; j <= n; j++)
c[0][j] = 0;
for(i = 1; i<= m; i++)
{
for(j = 1; j <= n; j++)
{
if(x[i-1] == y[j-1])
{
c[i][j] = c[i-1][j-1] + 1;
b[i][j] = 0;
}
else if(c[i-1][j] >= c[i][j-1])
{
c[i][j] = c[i-1][j];
b[i][j] = 1;
}
else
{
c[i][j] = c[i][j-1];
b[i][j] = -1;
}
}
}
}
void PrintLCS(int b[][MAXLEN], char *x, int i, int j)
{
if(i == 0 || j == 0)
return;
if(b[i][j] == 0)
{
PrintLCS(b, x, i-1, j-1);
printf("%c ", x[i-1]);
}
else if(b[i][j] == 1)
PrintLCS(b, x, i-1, j);
else
PrintLCS(b, x, i, j-1);
}
int main(int argc, char **argv)
{
char x[MAXLEN] = {"ABCBDAB"};
char y[MAXLEN] = {"BDCABA"};
int b[MAXLEN][MAXLEN];
int c[MAXLEN][MAXLEN];
int m, n;
m = strlen(x);
n = strlen(y);
LCSLength(x, y, m, n, c, b);
PrintLCS(b, x, m, n);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
124. 두 갈래 나무의 최대 경로와 leetcode비공 두 갈래 트리를 지정하고 최대 경로와 를 되돌려줍니다. 본고에서 경로는 나무의 임의의 노드에서 출발하여 임의의 노드에 도달하는 서열로 정의되었다.이 경로는 루트 노드를 거치지 않고 하나 이상의 노드를 포함합니다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.