这竟然是IOI虽然是2000年的,但其实也改变不了它水题的本质

我写了两种方法,这里都讲一下吧

考虑记忆化搜索,用f[i][j]表示当区间的左端为i,右端为j时最少要添加多少字符,所以ans就为f[1][n]

然后考虑一下,对于每一个f[i][j],都有转移:

  • s[i]==s[j],则有f[i][j]=f[i+1][j-1]

  • s[i]!=s[j] ,则有f[i][j]=min(f[i+1][j],f[i][j-1])(左右两边加一个字符,看看那种情况更优)

这里连枚举的顺序也懒得推了,直接跑了个记忆化搜索就过了

CODE

  1. #include<cstdio>
  2. #include<cstring>
  3. using namespace std;
  4. const int N=5005;
  5. short int f[N][N],n;
  6. char s[N];
  7. inline int min(int a,int b)
  8. {
  9. return a<b?a:b;
  10. }
  11. inline void DP(int l,int r)
  12. {
  13. if (l>=r) { f[l][r]=0; return; }
  14. if (s[l]==s[r])
  15. {
  16. if (f[l+1][r-1]==-1) DP(l+1,r-1);
  17. f[l][r]=f[l+1][r-1];
  18. } else
  19. {
  20. if (f[l+1][r]==-1) DP(l+1,r);
  21. if (f[l][r-1]==-1) DP(l,r-1);
  22. f[l][r]=min(f[l+1][r],f[l][r-1])+1;
  23. }
  24. }
  25. int main()
  26. {
  27. scanf("%d%s",&n,s+1);
  28. memset(f,-1,sizeof(f));
  29. DP(1,n);
  30. printf("%d",f[1][n]);
  31. return 0;
  32. }

注意这里的内存问题,开int的话都是要MLE的,但是由于数据范围5000,因此开short int足矣

还有一种算法,就是很套路的了

我们很轻易的发现,将原串倒过来之后,他们的最长公共子序列LCS都是不用再添加字符的,而对于其它的字符每个都要找一个字符与之相对应地匹配

证明不难,这里省略了,观察即可得出

LCS的DP方程也很简单,用f[i][j]表示第一个串前i个字符,第二个串前j个字符的LCS是多少,转移有

  • s[i]==s[j] f[i][j]=f[i-1][j-1]+1

  • s[i]!=s[j] f[i][j]=max(f[i-1][j],f[i][j-1])(之前的决策二选一)

是不是觉得和第一种的DP式有几分相似?其实他们本质上也是一样的!

所以又可以请出滚存来优化内存了

CODE

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. const int N=5005;
  5. int f[2][N],n;
  6. string s1;
  7. inline int max(int a,int b)
  8. {
  9. return a>b?a:b;
  10. }
  11. int main()
  12. {
  13. int i,j;
  14. ios::sync_with_stdio(false);
  15. cin>>n>>s1; string s2(s1.rbegin(),s1.rend());
  16. for (i=0;i<n;++i)
  17. {
  18. int now=(i+1)&1,lst=now^1;
  19. for (j=0;j<n;++j)
  20. if (s1[i]==s2[j]) f[now][j+1]=f[lst][j]+1; else f[now][j+1]=max(f[lst][j+1],f[now][j]);
  21. }
  22. cout<<n-f[n&1][n]<<endl;
  23. return 0;
  24. }

POJ1159的更多相关文章

  1. POJ1159——Palindrome(最长公共子序列+滚动数组)

    Palindrome DescriptionA palindrome is a symmetrical string, that is, a string read identically from ...

  2. POJ-1159 Palindrome---变成回文串的最小代价

    题目链接: https://cn.vjudge.net/problem/POJ-1159 题目大意: 题意很明确,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符 ...

  3. POJ1159:Palindrome【dp】

    题目大意:给出一个字符串,问至少添加多少个字符才能使它成为回文串? 思路:很明显的方程是:dp[i][j]=min{dp[i+1][j],dp[i][j-1],dp[i+1][j-1](str[i]= ...

  4. poj1159 dp最长公共子串

    //Accepted 204 KB 891 ms //dp最长公共子串 //dp[i][j]=max(dp[i-1][j],dp[i][j-1]) //dp[i][j]=max(dp[i][j],dp ...

  5. [POJ1159]Palindrome(dp,滚动数组)

    题目链接:http://poj.org/problem?id=1159 题意:求一个字符串加多少个字符,可以变成一个回文串.把这个字符串倒过来存一遍,求这两个字符串的lcs,用原长减去lcs就行.这题 ...

  6. POJ1159 - Palindrome(区间DP)

    题目大意 给定一个字符串S,问最少插入多少个字符可以使字符串S变为回文串 题解 用dp[i][j]表示把字符串s[i-j]变为回文串需要插入的最小字符数 如果s[i]==s[j]那么dp[i][j]= ...

  7. poj1159 Palindrome

    G - 回文串 Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u   Descripti ...

  8. POJ1159 Palindrome(dp)

    题目链接. 分析: 感叹算法的力量. 方法一: 设 dp[i][j] 为字符串 s, 从 i 到 j 需要添加的最少字符数. 那么如果 s[i] == s[j], dp[i][j] = dp[i+1] ...

  9. POJ1159 Palindrome(数位DP)

    Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 58277   Accepted: 20221 Desc ...

  10. poj1159 dp(滚动数组优化)

    H - 简单dp 例题扩展 Crawling in process... Crawling failed Time Limit:3000MS     Memory Limit:65536KB     ...

随机推荐

  1. Flutter 数据模型创建

    build_runner的使用 1.在根目录运行 2.一次性创建.g.dart文件 使用build 此时目录内不能有.g.dart文件 3.watch是监听 有model类的文件创建 自动创建.g.d ...

  2. 【Redis】Redis学习(三) Redis 主从模式详解

    不管任何程序,只运行一个实例都是不可靠的,一旦因为网络原因导致所在机器不可达,或者所在服务器挂掉,那么这个程序将不能对外提供服务了,Redis也是一样的.不过Redis的主从并不是解决这个问题的,一些 ...

  3. Python Django框架笔记(四):数据分页和CSRF跨站点请求伪造

    (一)数据分页  可以参考  https://docs.djangoproject.com/en/2.0/topics/pagination/ 模板:如果只要显示 1.2.3.4.5.6....的话, ...

  4. Git仓库初始化与推送到远端仓库

    以下命令为Git仓库初始化,添加远端代码托管仓库,以及推送到远端仓库的命令. 以 "github.com"为远端仓库做示例 # Git 库初始化 git init # 将文件添加到 ...

  5. EVE Online Third Party Development

    第一部分:price_history表 # 建表语句 CREATE TABLE IF NOT EXISTS `price_history` ( `regionID` INT NOT NULL, `ty ...

  6. MySQL常用查询语句积累

    >>MySQL某列插入递增值 SET @i := 100; UPDATE auge_item_classification SET c_code=(@i:=(@i+1)); >> ...

  7. Archive MySQL Data In Chunks Using Stored Procedure

    sqladminon September 26, 2018 In a DBA’s day to day activities, we are doing Archive operation on ou ...

  8. VS网站开发的发布部署的不同情况说明

    VS网站开发有两种模式: 1.网站模式 2.应用模式 其中,网站模式的发布,要考虑勾选“使用固定命名和单页程序集”   如下图   网站模式: 新建网站的网站模式   新建网站的网站模式第二步   应 ...

  9. canvas实例_在线画图工具

    fadsfklasdjfklasjdklfjasdlk;fjasd;lfjaskl;dfjal

  10. python批量连接mysql

    注释:脚本(gomysql.py)需要进一步优化,初学者,努力中 首先配置需要执行的dbip.ini列表,格式如下 S1  192.168.0.5   3306  dbusername dbpassw ...