[編輯長度/字串dp] HDOJ – 4323 Magic Number

來源:互聯網
上載者:User

http://acm.hdu.edu.cn/showproblem.php?pid=4323

關於編輯距離這篇部落格講得比較清楚, 還把第四種編輯"鄰位交換"加進去了.

現在突然覺得原來字串dp有好多,為什麼?因為字串是典型的無後效性吧,這種兩串來二維dp的比如最長公用字串也是經典dp了.

狀態原因:

// 狀態: d[i][j] 表示 串a的 i 長子串(0~i-1), 變到 串b的 j 長子串 要最少花費多少操作(即a到b的編輯距離).

狀態轉移:

(la lb表示串長度.)

memset(d, 0, sizeof(d));REP(la)d[i][0] = i;REP(lb)d[0][i] = i;FOR(i, 1, la)// 這裡 i , j 表示 長度, 不是串下標!!(因為如果是下標的話, 0長度子串下標為-1無法表示, 除非用記憶化搜尋解)FOR(j, 1, lb){int del = d[i][j-1]+1;int ins = d[i-1][j]+1;int sub = d[i-1][j-1]+!(a[i-1] == b[j-1]);d[i][j] = min(min(del, ins), sub);}

問題的解:

return d[la][lb];

好像還有什麼很厲害的BK樹....以後再看吧...

用dp解,第一次交800+ms, 然後把串長調低點再交600+ms, 然後把min函數自己寫inline, 484ms....還是挫...

代碼:

#include<cstdio>#include<cstring>#include<iostream>#include<cmath>#include<string>#include<vector>#include<map>#include<algorithm>using namespace std;int Rint() { int x; scanf("%d", &x); return x; }#define FOR(i, a, b) for(int i=(a); i<=(b); i++)#define FORD(i,a,b) for(int i=(a);i>=(b);i--)#define REP(x) for(int i=0; i<(x); i++)typedef long long int64;#define INF (1<<30)#define bug(s) cout<<#s<<"="<<s<<" "//多決策dp, 字串dp, 字串編輯距離// 狀態: d[i][j] 表示 串a的 i 長子串(0~i-1), 變到 串b的 j 長子串 要最少花費多少操作(即a到b的編輯距離).#define MAXLEN 12//串長#define MAXN 1502//目標串個數#define MAXM 1002//源串個數int d[MAXLEN+1][MAXLEN+1];//d[源][目標], 準確來講下標應為 MAXLEN+1int la, lb;//la源串長int n, m;//目標串個數, 源串個數char strb[MAXN][MAXLEN];//目標串schar stra[MAXLEN];//源串int lim;// 閥值inline int min(int a,int b)  {      return (a<b)?a:b;  }int dp(char* a, char* b){memset(d, 0, sizeof(d));REP(la)d[i][0] = i;REP(lb)d[0][i] = i;FOR(i, 1, la)// 這裡 i , j 表示 長度, 不是串下標!!(因為如果是下標的話, 0長度子串下標為-1無法表示, 除非用記憶化搜尋解)FOR(j, 1, lb){int del = d[i][j-1]+1;int ins = d[i-1][j]+1;int sub = d[i-1][j-1]+!(a[i-1] == b[j-1]);d[i][j] = min(min(del, ins), sub);}return d[la][lb];}int main(){int T = Rint();FOR(t, 1, T){printf("Case #%d:\n", t);n = Rint();m = Rint();REP(n){scanf("%s", strb[i]);}REP(m){int ans = 0;scanf("%s%d", stra, &lim);la = strlen(stra);FOR(j, 0, n-1){int done = 0;lb = strlen(strb[j]);if(abs(la-lb)>lim){}else{int cnt = dp(stra, strb[j]);done = cnt<=lim? 1: 0;}if(done){//bug(strb[j])<<endl;ans++;}}printf("%d\n", ans);}}}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.