Chinaunix首页 | 论坛 | 博客
  • 博客访问: 125781
  • 博文数量: 42
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 354
  • 用 户 组: 普通用户
  • 注册时间: 2014-07-01 15:34
个人简介

不晓得说啥子

文章分类

全部博文(42)

文章存档

2015年(41)

2014年(1)

我的朋友

分类: C/C++

2015-04-04 10:21:49


点击(此处)折叠或打开

  1. //我个人的理解就是当前行的结果只与前一行的结果有关
  2. //所以每次枚举行的时候滚动数组的行%2;
  3. //就只有0,1,两种状态 也就是两行交替存储答案 。。。就这样的 不然内存不够用的哦
  4. #include<iostream>
  5. #include<string>
  6. using namespace std;
  7. int ans[3][5005];
  8. int max(int a,int b)
  9. {
  10.     if(a>b) return a;
  11.     return b;
  12. }
  13. int main()
  14. {
  15.     int i,j,n;
  16.     char s1[5005],s2[5005];
  17.  // freopen("E:\\test.txt","r",stdin);
  18.     while(cin>>n)
  19.     {
  20.         cin>>s1;
  21.         for(i=0;i<n;i++)
  22.         {
  23.             s2[i]=s1[n-i-1];
  24.         }
  25.   s2[n]='\0';
  26.  // cout<<s1<<endl<<s2<<endl;
  27.         memset(ans,0,sizeof(ans));
  28.         for(i=0;i<n;i++)
  29.         {
  30.             ans[0][i]=0;
  31.         }
  32.         for(i=1;i<=n;i++)
  33.         {
  34.             for(j=1;j<=n;j++)
  35.             {
  36.                 if(s2[j-1]==s1[i-1])
  37.                 {
  38.                     ans[i%2][j]=ans[(i-1)%2][j-1]+1;
  39.                 }
  40.                 else
  41.                 {
  42.                     ans[i%2][j]=max(ans[(i-1)%2][j],ans[i%2][j-1]);
  43.                 }
  44.             }
  45.         }
  46.         cout<<n-ans[n%2][n]<<endl;
  47.     }
  48.     return 0;
  49. }

阅读(925) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~