正文

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;
}
  

阅读(3810) | 评论(0)


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

评论

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