正文

Zju 1425 Crossed Matchings2006-08-21 15:49:00

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

分享到:

2035433 2006-08-21 15:25:00 Accepted 1425 C++ 00:00.01 432K St.Crux 这是一道典型的dp题。ZC的解题报告告诉我....... 自己看吧。辛辛苦苦写了15分钟的我的解题报告被Maxthon的鼠标手势给毁了,我真倒霉。 我的算法更加保险,也可以理解为更加笨拙。有一点不明白的地方是为什么他可以用该杀的贪心?这怎么可以用贪心?呜......我就等于O(n^4)了。 #include <cstdio>#include <string>int n, an, bn, a[101], b[101], r[101][101]; void dp(){ int i, k, mx, j, u; memset(r, 0, sizeof(r)); for(i = 1; i <= an; i ++) {  for(k = 1; k <= bn; k ++)  {   mx = 0;   if(a[i] != b[k])   {    for(j = i - 1; j > 0; j --)    {     if(a[j] == b[k])     {      for(u = k - 1; u > 0; u --)      {       if(b[u] == a[i])       {        if(u && j && mx < r[j - 1][u - 1] + 2)         {         mx = r[j - 1][u - 1] + 2;        }       }      }     }    }       }   if(mx < r[i - 1][k])    mx = r[i - 1][k];   if(mx < r[i][k - 1])    mx = r[i][k - 1];   if(mx < r[i - 1][k - 1])    mx = r[i - 1][k - 1];   r[i][k] = mx;  } }} void print(){ //pr(); printf("%d\n", r[an][bn]);} int main(){ //freopen("in.txt", "r", stdin); scanf("%d", &n); int i, k; for(i = 0; i < n; i ++) {  scanf("%d %d", &an, &bn);  for(k = 1; k <= an; k ++)  {   scanf("%d", &a[k]);  }  for(k = 1; k <= bn; k ++)  {   scanf("%d", &b[k]);  }  dp();  print(); } return 0;}  

阅读(4007) | 评论(0)


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

评论

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