• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
L&King
有何不可!
   首页    新随笔    联系   管理    订阅  订阅

动态规划求最长回文子序列模板

子序列是不连续的,子串是连续的。

 1 #include<stdio.h> 
 2 #include<string.h>
 3 #include<iostream>
 4 using namespace std;
 5 const int N=1111;
 6 int f[2][N],a[N];
 7 int main()
 8 {
 9     int t,n,i,j;
10     scanf("%d",&t);
11     while(t--)
12     {
13         scanf("%d",&n);
14         for(i=1;i<=n;i++)
15             scanf("%d",&a[i]);
16         memset(f,0,sizeof(f));
17         int now=0;
18         for(i=n;i;--i)
19         {
20             f[now][i]=1;
21             for(j=i+1;j<=n;j++)
22             {
23                 if(a[i]==a[j])
24                     f[now][j]=f[1-now][j-1]+2;
25                 else
26                     f[now][j]=max(f[1-now][j],f[now][j-1]);
27             }
28             now=1-now;
29         }
30         if(n%2==0)
31             printf("%d\n",f[1][n]);
32         else
33             printf("%d\n",f[0][n]);
34     }
35     return 0;
36 }

滚动数组,空间复杂度为O(N)。时间复杂度O(N^2)。上面的代码是2016中南大学校赛的J题。

posted @ 2016-04-25 15:09  L&King  阅读(249)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3