POJ1159 Palindrome(dp)
2024-10-12 20:36:37
题目链接。
分析:
感叹算法的力量。
方法一:
设 dp[i][j] 为字符串 s, 从 i 到 j 需要添加的最少字符数。
那么如果 s[i] == s[j], dp[i][j] = dp[i+1][j-1]. 如果 s[i] != s[j], dp[i][j] = min(dp[i+1][j], dp[i][j-1]) + 1.
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <map> using namespace std; const int maxn = ; short dp[maxn][maxn];
char s[maxn]; int d(int i, int j) {
if(i >= j) return ;
else if(dp[i][j] != -) return dp[i][j];
else if(s[i] != s[j]) return (dp[i][j] = min(d(i+, j), d(i, j-)) + );
else return dp[i][j] = d(i+, j-);
} int main(){
// freopen("my.txt", "r", stdin);
int n;
while(scanf("%d", &n) == ) {
memset(dp, -, sizeof(dp)); scanf("%s", s);
d(, n-);
printf("%d\n", dp[][n-]);
} return ;
}
方法二:
LCS + 滚动数组.
设原序列S的逆序列为S',
最少需要补充的字母数 = 原序列S的长度 — S和S'的最长公共子串长度
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <map> using namespace std; const int maxn = +; int dp[][maxn];
char s1[maxn], s2[maxn]; int main(){
int n; while(scanf("%d", &n) == ) {
scanf("%s", s1); memset(dp[], , sizeof(dp[]));
for(int i=; i<n; i++) {
s2[n-i-] = s1[i];
}
s2[n] = '\0'; for(int i=; i<=n; i++) {
for(int j=; j<=n; j++) {
if(s1[i-] == s2[j-]) dp[i%][j] = dp[(i-)%][j-] + ;
else dp[i%][j] = max(dp[(i-)%][j], dp[i%][j-]);
}
} printf("%d\n", n-dp[n%][n]);
} return ;
}
最新文章
- Python 之简易单链表
- java.lang.IncompatibleClassChangeError: Implementing class的解决办法,折腾了一天总算解决了
- Centos6.7安装docker1.7.1
- LeetCode Majority Element I &;&; II
- 【Shell脚本学习17】Shell case esac语句
- php错误收集
- convert source code files to pdf format in python
- Java版本的在指定目录及子目录下创建指定的文件
- kubectl自动补全
- vscode 前端插件推荐
- React browserHistory.push()传参
- 全志A33开发板的安卓控制LED-2-JNI基础
- Nginx详解二十八:Nginx架构篇Nginx+Lua的安全waf防火墙
- [Web 前端] webstorm 快速搭建react项目
- BCB 按钮添加背景图
- PY3 周总结 第一周
- 使用 Shell 脚本自动化 Linux 系统维护任务
- CAS 5.1.x 的搭建和使用(二)—— 通过Overlay搭建服务端-其它配置说明
- 【java web】Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
- 未来HTML6出现的10个特性