首页 > 其他分享 >洛谷题单指南-动态规划2-P1435 [IOI2000] 回文字串

洛谷题单指南-动态规划2-P1435 [IOI2000] 回文字串

时间:2024-05-05 14:01:22浏览次数:17  
标签:插入 IOI2000 洛谷题 length int P1435 文字串 dp 逆序

原题链接:https://www.luogu.com.cn/problem/P1435

解题思路:

方法1:

回文字串的特点是,正着读、反着读是一样的

换一个思路,对于一个字符串s,正序、逆序公共的部分就是已经是回文的部分,剩余的部分就是要插入的字符

所以,问题转换为,计算一个字符串正序、逆序的最长公共子串,然后剩下的长度即要插入的最少字符数。

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 1005;
string s;
int dp[N][N]; // dp[i][j]表示正序1~i,逆序len~j的最长公共子序列

int main()
{
    cin >> s;
    int l = s.length();
    s = " " + s;
    for(int i = 1; i <= l; i++)
    {
        for(int j = l; j >= 1; j--)
        {
            if(s[i] == s[j]) dp[i][j] = dp[i-1][j+1] + 1;
            else dp[i][j] = max(dp[i][j+1], dp[i-1][j]);
        }
    }

    cout << l - dp[l][1];

    return 0;
}

方法2:

设dp[i][j]表示把i~j变成回文字串需要插入的最少字符数

设字符串为s

如果s[i] == s[j],dp[i][j] = dp[i+1][j-1],和i+1 ~ j-1的结果一致

否则,可以在i前面插入s[j],也可以在j后面插入s[i],取较小值,dp[i][j] = min(dp[i][j-1] + 1, dp[i+1][j] + 1);

由于最终结果是dp[1][s.length()],i要从大到小遍历,j要从小到大遍历,且保证i <= j

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 1005;
string s;
int dp[N][N]; // dp[i][j]表示把i~j变成回文字串需要插入的最少字符数

int main()
{
    cin >> s;
    int l = s.length();
    s = " " + s;
    for(int i = l; i >= 1; i--) 
    {
        for(int j = i; j <= l; j++)
        {
            if(s[i] == s[j]) dp[i][j] = dp[i+1][j-1];
            else
            {
                //可以在i前面插入s[j],也可以在j后面插入s[i]
                dp[i][j] = min(dp[i][j-1] + 1, dp[i+1][j] + 1);
            }
        }
    }

    cout << dp[1][l];

    return 0;
}

 

标签:插入,IOI2000,洛谷题,length,int,P1435,文字串,dp,逆序
From: https://www.cnblogs.com/jcwy/p/18173460

相关文章

  • 洛谷题单指南-动态规划2-P1091 [NOIP2004 提高组] 合唱队形
    原题链接:https://www.luogu.com.cn/problem/P1091题意解读:要挑选一个最长的先上升后下降的序列,求其余的元素数量解题思路:先计算正向的最长上升子序列,设f[i]表示以i结尾的正向最长上升子序列再计算逆向的最长上升子序列,设g[i]表示以i结尾的逆向最长上升子序列再枚举所有的i<j,m......
  • 洛谷题单指南-动态规划2-P1004 [NOIP2000 提高组] 方格取数
    原题链接:https://www.luogu.com.cn/problem/P1004题意解读:从起点走到终点,走两次,计算最大路径和,第一次走过的点数值变为0。解题思路:直观上思考,可以先从起点走到终点,计算最大路径和,并记录走过的所有点,然后把所有点的数值置为0,再从起点走到终点,计算最大路径和,把两次的最大路径......
  • 洛谷题单指南-动态规划2-P2679 [NOIP2015 提高组] 子串
    原题链接:https://www.luogu.com.cn/problem/P2679题意解读:在a中按顺序挑选k个子串,使得这些子串连在一起正好和b相等,求方案数。解题思路:这样的题目,无外乎两个思路:DFS暴搜(得部分分)、动态规划动态规划不好想,还是先暴搜吧!1、DFS暴搜搜索的思路就是:从a起始位置开始,一直找到跟b前......
  • 洛谷题单指南-动态规划2-P1439 【模板】最长公共子序列
    原题链接:https://www.luogu.com.cn/problem/P1439题意解读:求最长公共子序列的长度。解题思路:1、O(n^2)的方法:动态规划设两个排列为a,b设dp[i][j]表示a[1~i]与b[1~j]的最长公共子序列长度根据公共子序列结尾是否包含a[i]、b[j]是否相等分情况讨论:如果a[i]==b[j]  则结尾......
  • 洛谷题解-官方题单-递归与递推
    P1255数楼梯原题链接题目描述楼梯有N阶,上楼可以一步上一阶,也可以一步上二阶。编一个程序,计算共有多少种不同的走法。对于60%的数据,N≤50;对于100%的数据,1≤N≤5000。思路:每次有2种方法上楼梯,要么上一阶,要么上二阶。第一种:得50分的做法是可以用递归来解:点击查看代码......
  • 洛谷题单指南-动态规划2-P2758 编辑距离
    原题链接:https://www.luogu.com.cn/problem/P2758题意解读:对a字符串最少操作几次可以变成b字符串,看似无从下手,可以从内部递推关系着手。解题思路:设dp[i][j]表示将a字符串1~i变成b字符串1~j的最少操作次数,字符串下标从1开始。如何思考递推?可以从最后一步为切入点!最后一步对a[i]......
  • 洛谷题单指南-动态规划2-P1874 快速求和
    原题链接:https://www.luogu.com.cn/problem/P1874题意解读:一个数字字符串s,分解成几个整数,和为n,计算最少加号个数,也就是计算最少分解的整数个数-1。解题思路:此题虽然分类在动态规划,但数据量不大,DFS更加直观和易于理解,所以采用DFS暴搜+剪枝来解决。搜索思路是对数字字符串依次枚......
  • 洛谷题单指南-动态规划2-P4933 大师
    原题链接:https://www.luogu.com.cn/problem/P4933题意解读:求有多少个子序列可以组成等差序列解题思路:1、暴力DFS如果实在想不出动规的方法,对于n<=20的数据,可以DFS枚举所有子序列的子集,再判断是否是等差数列。30分代码:#include<bits/stdc++.h>usingnamespacestd;const......
  • 洛谷题单指南-动态规划2-P1725 琪露诺
    原题链接:https://www.luogu.com.cn/problem/P1725题意解读:走过一系列格子之后,冰冻指数之和最大,相当于计算最大子序列的和。解题思路:设a[0~n]保存所有冰冻指数设dp[i]表示以第i号格子为终点所能获得的最大冰冻指数设j表示i的前一个格子,也就是从j可以移动到i已知i,则j的范围也......
  • 洛谷题单指南-动态规划2-P1020 [NOIP1999 提高组] 导弹拦截
    原题链接:https://www.luogu.com.cn/problem/P1020题意解读:拦截系统发射导弹的高度依次不增,计算能拦截的最大导弹数以及需要几套拦截系统。解题思路:问题1:最多能拦截多少导弹?由于发射导弹高度不增,所以求一个最长不增子序列即可得到最大拦截数。方法一、O(n^2)做法:动态规划。采......