正文

Zju 1642 Match for Bonus2007-01-23 00:04:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/cruxd/22759.html

分享到:

    这是一题典型的最大公共子序列。一开始没看出来,直到写dp写不下去,赶紧去翻busycai大牛的程序才恍然大悟。     用f[i][k]表示a取到i,b取到k时最大的权值。f[i][k] = max (f[i - 1][k - 1] + v[i], f[i][k - 1], f[i - 1][k])。其中第一个表示i和k时取到相同的字符。   #include <cstdio>#include <string> int v[501], n, ans, f[2001][2001], len;char str[2][2001]; int dp (){ int i, k; len = strlen (str[0]); memset (f, 0, sizeof(f));  for (i = 1; i <= len; i ++) {  for (k = 1; k <= len; k ++)  {   if (str[0][i - 1] == str[1][k - 1])   {    f[i][k] = f[i - 1][k - 1] + v[str[0][i - 1]];   }   int mx = f[i - 1][k] > f[i][k - 1] ? f[i - 1][k] : f[i][k - 1];   if (mx > f[i][k]) f[i][k] = mx;  } } return f[len][len];}  int main (){ //freopen ("in.txt", "r", stdin); while (scanf ("%d", &n) != EOF) {  int i, value;  char ch;  for (i = 0; i < n; i ++)  {   getchar ();   scanf ("%c %d", &ch, &value);   v[ch] = value;  }  scanf ("%s %s", &str[0], &str[1]);    printf ("%d\n", dp ());  //pf (); } return 0;}  

阅读(3913) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册