标签:style blog http color io for ar div
http://poj.org/problem?id=3356
题意:
给两个长度不大于1000的串,修改其中一个串使得两串相同,问最少修改次数。修改有三种,插入一个字符,删除一个字符,改变一个字符。
分析:
直接给方程。
dp[i][j]表示第一个串前i位和第二串前j位匹配的最小修改次数。
dp[0][0] = 0, dp[length(x)][length(y)]为答案。
dp[i][j] = min(dp[i-1][j-1] + x[i] != y[j], dp[i-1][j] + 1, dp[i][j-1] + 1)
假设修改的是x串,那么右侧三项分别对应改变(如果已经相同则不必),删除,插入。
然后发现实际上是对称的,修改的是y串,三项对应改变,插入,删除。
我感觉如果允许同时修改两串,其实方程也一样,结果也一样,因为删除x串对应插入y串,插入y串对应删除x串。
然后这题坑爹在于多组case,看了discuss才知道。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 int lx, ly, oo; 7 char x[1100], y[1100]; 8 int dp[1100][1100]; 9 bool same(int i, int j) 10 { 11 if (x[i] == y[j]) return true; 12 else return false; 13 } 14 int main() 15 { 16 while(scanf("%d %s %d %s", &lx, x, &ly, y) != EOF) 17 { 18 memset(dp, 127, sizeof(dp)); 19 oo = dp[0][0]; 20 dp[0][0] = 0; 21 for (int i = 0; i <= lx; i++) 22 for (int j = 0; j <= ly; j++){ 23 if (i > 0 && j > 0 && dp[i-1][j-1] != oo) 24 dp[i][j] = min(dp[i][j], dp[i-1][j-1] + 1 - same(i-1, j-1)); //Change 25 if (i > 0 && dp[i-1][j] != oo) 26 dp[i][j] = min(dp[i][j], dp[i-1][j] + 1); //Deletion of x or Insertion of y 27 if (j > 0 && dp[i][j-1] != oo) 28 dp[i][j] = min(dp[i][j], dp[i][j-1] + 1); //Insertion of x or Deletion of y 29 // printf("%d %d %d\n", i, j, dp[i][j]); 30 } 31 printf("%d\n", dp[lx][ly]); 32 } 33 return 0; 34 }
POJ 3356 AGTC 最短编辑距离 DP,布布扣,bubuko.com
标签:style blog http color io for ar div
原文地址:http://www.cnblogs.com/james47/p/3890965.html