matrixChain(i, j)
{
for i ← 1 to n
m[i, i] ← 0; //m이라는 2차원 배열(n*m)
for r ← 1 to n-1 ▷ 문제의 크기 = r=n
for i ← 1 to n-r {
j ← i+r;
m[i j] i, ← min {m[i, k] + m[k+1, j] + pi-1pkpj};
}
return m[1, n];//맨마지막에return하는값
}
Xm=<x1,x2...Xm> LCS Xm-1= Yn-1=> Zk-1
Yn=<y1,y2...Yn>
Zk=<z1.z2,///Zk>
xm= yn이면Xm과 Yn의 LCS의 길이는 Xm-1과 Yn-1의 LCS의 길이보다
1이 크다 ->이건알아두삼
xm≠ yn이면 Xm과 Yn의 LCS의 길이는 Xm과 Yn-1의 LCS의 길이와 Xm-
1과Yn의 LCS의 길이 중큰 것과 같다
LCS(m, n)
▷ 두 문자열 Xm과 Yn의 LCS 길이 구하기
{
for i ← 0 to m
C[i, 0] ← 0;
for j ← 0 to n
C[0, j] ← 0;
for i ← 1 to m
for j ← 1 to n
if (xm= yn) then C[i, j] ← C[i-1, j-1] + 1;
else C[i, j] ← max(C[i-1, j], C[i, j-1]);
return C[m, n];
}
#include <iostream>
#include <string>
using namespace std;
//starcat->문자열붙이는함수
#define max(a,b) (((a)>(b))?(a):(b))
int charCnt(char charPtr[]);
int LCS(int m, int n, char x[], char y[]);
int main(){
int m,n;
char xString[20], yString[20];
char X[20]="0";
char Y[20]="0";
//입력
cout<<"문자열 xm입력=";
cin>>xString;
cout<<"문자열 yn입력=";
cin>>yString;
strcat(X,xString);
m=charCnt(X);
strcat(Y,yString);
n=charCnt(Y);
cout<<"LCS길이:"<<LCS(m,n,X,Y);
system("PAUSE");
return 0;
}
//CharCnt함수 내부 문자열을 받았을때
int charCnt(char charPtr[]){
int count=0;
while(charPtr[count]!='\0')
count++;
return count;
}
int LCS(int m, int n, char x[], char y[]){
int **C;
C=new int*[m+1];
for(int i=0;i<=m;i++)
C[i]=new int[n+1];
for(int i=0;i<m;i++)
C[i][0]=0;
for(int j=0;j<n;j++)
C[0][j]=0;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
if(x[i] == y[j]&&x[i]!='\0'&&y[j]!='\0')
C[i][j] = C[i-1][j-1]+1;
else C[i][j] = max(C[i-1][j],C[i][j-1]);
return C[m][n];
}
'Not Using > algorithm' 카테고리의 다른 글
Dynamic programming (0) | 2009.11.17 |
---|---|
해쉬테이블 완성 (0) | 2009.11.09 |
완성못한 해쉬테이블 (0) | 2009.11.03 |
이런망할이진검색트리 (0) | 2009.10.27 |
알고리즘 --- (0) | 2009.10.13 |