DP h回文子串 LCS
2024-08-26 20:38:50
题目背景
IOI2000第一题
题目描述
回文词是一种对称的字符串。任意给定一个字符串,通过插入若干字符,都可以变成回文词。此题的任务是,求出将给定字符串变成回文词所需要插入的最少字符数。
比如 “Ab3bd”插入2个字符后可以变成回文词“dAb3bAd”或“Adb3bdA”,但是插入少于2个的字符无法变成回文词。
注:此问题区分大小写
输入输出格式
输入格式:
一个字符串(0<strlen<=1000)
输出格式:
有且只有一个整数,即最少插入字符数
输入输出样例
输入样例#1: 复制
Ab3bd
输出样例#1: 复制
2 这个是一个dp的题目,说实话我自己有点不敢相信,因为完全没有看出来,
但是呢,dp不仅仅只有背包问题,还有很多LCS,LIS,DAG等等,这个如果你熟悉LCS,也不一定可以想到就是这个,我也是看了题解才会的,
这个回文子串,它的特性就是反过来也应该是一样的,那么就找他们最长的公共字串,然后剩下的就补上就可以了。
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
const int maxn = ;
char a[maxn],s[maxn];
int dp[maxn][maxn]; int main()
{
cin >> s;
int len = strlen(s),cur=;
for (int i = len - ; i >= ; i--)
{
a[cur++] = s[i];
}
memset(dp, , sizeof(dp));
for (int i = ; i < len; i++)
{
for (int j = ; j < len; j++)
{
if (s[i] == a[j])
{
dp[i + ][j + ] = dp[i][j] + ;
}
else
{
dp[i + ][j + ] = max(dp[i + ][j], dp[i][j + ]);
}
}
}
//printf("%d\n", dp[len][len]);
int ans = len - dp[len][len];
printf("%d\n", ans);
return ;
}
最新文章
- Android 笔记 AutoCompleteTextView day8
- C#进阶系列——MEF实现设计上的“松耦合”(四):构造函数注入
- 《利用python进行数据分析》读书笔记--第七章 数据规整化:清理、转换、合并、重塑(三)
- Android 2016新技术
- 在oracle里写各种语句得心应手,但是在mybatis.xml文件里呢?
- 【Vegas原创】RHEL6多界面切换方法
- opencv笔记6:角点检测
- IE 火狐浏览器对时间格式的兼容性;使用原型对象的方式 prototype关键字;时间格式化
- MySQL 主从架构配置详解
- Python 替换字符串
- js和jQuery创建元素和把元素插入到文档中所用的方法
- mysql存储过程controller的not found造成混乱的解决办法
- MySQL数据库的环境及简单操作
- 图解MYSQL JOIN ON,SQL JOIN 详解,数据库sql join语句
- Cocos2d-x发展---更改父的颜色、透明度的子节点上
- 为什么说Java中只有值传递
- [原创]基于Zynq Linux环境搭建资源
- 使用npm安装appium时的坑
- Scrapy快速上手
- 【前端vue开发】vue知识点超链接学习笔记