結果

問題 No.225 文字列変更(medium)
ユーザー codershifthcodershifth
提出日時 2016-01-28 09:58:59
言語 C++11
(gcc 13.3.0)
結果
WA  
実行時間 -
コード長 1,530 bytes
コンパイル時間 1,357 ms
コンパイル使用メモリ 163,180 KB
実行使用メモリ 7,040 KB
最終ジャッジ日時 2024-09-21 17:45:18
合計ジャッジ時間 2,346 ms
ジャッジサーバーID
(参考情報)
judge5 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 17 WA * 5
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>

typedef long long ll;
typedef unsigned long long ull;

#define FOR(i,a,b) for(int (i)=(a);i<(b);i++)
#define REP(i,n) FOR(i,0,n)
#define RANGE(vec) (vec).begin(),(vec).end()

using namespace std;


class ChangeStringMedium
{
public:
    void solve(void)
    {
            int n,m;
            cin>>n>>m;
            string S,T;
            cin>>S>>T;

            const int inf = (1<<30);

            // ルーベンシュタインの編集距離
            // dp[i][j] := S[0...i] から T[0...j] へ変更するときの最小操作回数
            vector<vector<int>> dp(n+1,vector<int>(m+1,inf));
            if ( S[0] == T[0] )
                dp[0][0] = 0;
            else
                dp[0][0] = 1;

            // O(n*m)
            REP(i,n)
            REP(j,m)
            {
                dp[i+1][j] = min(dp[i+1][j], dp[i][j]+1); // 削除が必要
                dp[i][j+1] = min(dp[i][j+1], dp[i][j]+1); // 挿入が必要

                if (i+1 < n && j+1 < m)
                {
                    if (S[i+1] == T[j+1])
                        dp[i+1][j+1] = min(dp[i+1][j+1], dp[i][j]);
                    else
                        dp[i+1][j+1] = min(dp[i+1][j+1], dp[i][j] + 1); // 置換が必要
                }
            }
            cout<<dp[n-1][m-1]<<endl;
    }
};

#if 1
int main(int argc, char *argv[])
{
        ios::sync_with_stdio(false);
        auto obj = new ChangeStringMedium();
        obj->solve();
        delete obj;
        return 0;
}
#endif
0