POJ3356 – AGTC(구간 DP & 편집 거리)

3999 단어 poj

제목의 대의.


문자열 X 및 Y를 지정하여 세 가지 작업을 수행할 수 있습니다.
1, 문자 삭제
2, 문자 삽입
3. 문자 바꾸기
매 조작의 대가는 1이다. 상기 세 가지 조작을 운용하여 X를 Y로 바꾸는 데 필요한 최소 걸음수는 얼마인가?

문제풀이


dp[i][j]를 X의 앞 i자를 Y의 앞 j자로 변환하는 데 필요한 최소 단계
만약 X[i]==Y[j]라면 dp[i][j]=dp[i-1][j-1]
하면, 만약, 만약...Y[j]는 dp[i][j]=min(dp[i-1][j-1]+1, dp[i-1][j]+1, dp[i][j-1]+1)

코드:

#include<iostream>

#include<cstdio>

#include<cstring>

using namespace std;

#define MAXN 1005

char x[MAXN],y[MAXN];

int dp[MAXN][MAXN];

int main()

{

    int n,m;

    while(~scanf("%d%s",&n,x+1))

    {

        memset(dp,0,sizeof(dp));

        scanf("%d%s",&m,y+1);

        dp[0][0]=0;

        for(int i=1; i<=n; i++)

            dp[i][0]=i;

        for(int j=1; j<=m; j++)

            dp[0][j]=j;

        for(int i=1; i<=n; i++)

            for(int j=1; j<=m; j++)

                if(x[i]==y[j])

                    dp[i][j]=dp[i-1][j-1];

                else

                {

                    dp[i][j]=min(dp[i-1][j],dp[i][j-1])+1;

                    dp[i][j]=min(dp[i][j],dp[i-1][j-1]+1);

                }

        printf("%d
",dp[n][m]); } return 0; }

좋은 웹페이지 즐겨찾기