51nod1092(lcs简单运用/dp)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1092
题意:中文题诶~
思路:
解法1:最坏的情况就是在原字符串的右边添加该字符串的倒序字符串咯,长度为a.size(),不难想到原字符串和其倒序字符串可能存在公共子序列,公共子序列含有的字符我们是不需要添加的(因为两边原本就有嘛).我们要使添加的字符最少,那么就是找到最大的公共子序列,再用a.size()减去公共子序列含有的字符数目就好啦,即:
ans=a.size()-lcs(a, b), 其中b为a的倒序字符串;
代码:
1 #include <bits/stdc++.h> 2 #define MAXN 1010 3 using namespace std; 4 5 int dp[MAXN][MAXN]; 6 7 int main(void){ 8 string a, b; 9 cin >> a; 10 b=a; 11 reverse(b.begin(), b.end()); 12 int len=a.size(); 13 for(int i=0; i<len; i++){ 14 for(int j=0; j<len; j++){ 15 if(a[i]==b[j]){ 16 dp[i+1][j+1]=dp[i][j]+1; 17 }else{ 18 dp[i+1][j+1]=max(dp[i+1][j], dp[i][j+1]); 19 } 20 } 21 } 22 cout << len-dp[len][len] << endl; 23 }
解法2:
我们可以用dp[i][j]存储从第i个字符开始长度为j的字符串变成会文串需要添加的最少字符,那么初始化:
dp[0][j]=0, dp[1][j]=0,长度为0,1的字符串自然是回文串啦;
状态转移方程式为:
if(a[j]==a[i+j-1] dp[i][j]=dp[i-1][j+1]
else dp[i][j]=min(dp[i-1][j], dp[i-1][j+1])+1
这些还是比较好理解的,直接上代码好了..
代码:
1 #include <bits/stdc++.h> 2 #define MAXN 1010 3 using namespace std; 4 5 int dp[MAXN][MAXN]; //***dp[i][j]存储从第j个字符开始,长度为i的字符串变成回文串最少需要添加的字符数 6 7 int main(void){ 8 string a; 9 cin >> a; 10 int len=a.size(); 11 for(int i=2; i<=len; i++){ 12 for(int j=0; j<len; j++){ 13 if(a[j]==a[j+i-1]){ 14 dp[i][j]=dp[i-2][j+1]; 15 }else{ 16 dp[i][j]=min(dp[i-1][j], dp[i-1][j+1])+1; 17 } 18 } 19 } 20 cout << dp[len][0] << endl; 21 return 0; 22 }
转载于:https://www.cnblogs.com/geloutingyu/p/6285971.html
51nod1092(lcs简单运用/dp)相关推荐
- 蓝桥杯 算法训练 数字三角形(最简单的DP)
传送门 题目描述 如下图示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路径,使该路径所经过的数字的总和最大. ●每一步可沿左斜线向下或右斜线向下走: ●1<三角形行数≤100: ● ...
- (蓝桥杯)数字三角形。。(最简单的dp题)
(图3.1-1)示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大. ●每一步可沿左斜线向下或右斜线向下走: ●1<三角形行数≤100: ●三角形 ...
- 来自wzc的简单拓扑dp
来自wzc的简单拓扑dp(拓扑DP) 题目已经把解决方案给你了,就是拓扑DP(出题人这回没有耍你,真的) 不过我还是莽了两发dijk贪心QAQ,果然错了(毕竟DP弱者,巨贪心)- 正片开始 有向图拓扑 ...
- 来自wzc的简单拓扑dp———浙江农林大学第二十届程序设计竞赛暨团体程序设计天梯赛选拔赛(同步赛)
传送门 题目描述 (良心出题人wzc说这是个简单拓扑dp,它就必然是一个简单拓扑dp,wzc是不会骗人的) wzc在一张拓扑图上,他所在的起始位置被标记为0.除了起始位置外,还有被1到n这n个整数所标 ...
- 简单Profibus/DP实验系统的组建
简单Profibus/DP实验系统的组建 Writed by 远方 DND-DeviceNet 引言: 为了让更多刚接触到Profibus系统的朋友能对Profibus的网络架构及系统运行机制有一个整 ...
- 守望者的逃离一道简单的DP
现在的水平做一些简单的dp问题还是能单刷出来了 1144 守望者的逃离 2007年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 ...
- poj 1192(简单树形dp)
题意:这题描述看似很复杂, 其实读懂后就是一个相邻点之间连通问题,水题. 解题思路:首先把相邻的点连接起来建立一棵树,dp[i][0]表示不选择i节点可以得到的最大价值,dp[i][1]表示选择i节点 ...
- poj 3280(简单区间dp)
题意:将一个字符串转换成回文串的最小花费. 解题思路:简单的区间dp,dp[i][j]表示从i到j的字符串转换成回文串的最小化费. #include<iostream> #include& ...
- AtCoder Grand Contest 021 D - Reversed LCS(区间dp)
D - Reversed LCS 繁凡さん 设 f[l,r,k]f [ l , r , k ]f[l,r,k] 表示区间 [l,r][ l , r ][l,r] 中修改 kkk 次能得到的最长回文子序 ...
最新文章
- 如何使‘CREATE TABLE AS SELECT’能支持ORDER BY ?
- 大四生活总结20101015
- java 颜色比较_我该如何比较Java中的颜色?
- 架构师之路(1)---面向过程和面向对象
- java 解析 manifest_解析AndroidManifest.xml之AXMLParser.java | 学步园
- c++builder 运行网站的api_04 将您的API Builder Docker映像发布到AMPLIFY运行时服务(ARS)...
- 苹果公布App审查新机制 禁止发布疫情相关娱乐程序和游戏
- 距离向量路由算法及举例
- 关于array.sort(array,array)
- Python 语言程序设计(4-2)分支循环--无限循环
- lnmp php 5.4,linux下搭建LNMP(linux+nginx+mysql+php)环境之php5.4安装
- python中文聊天_GitHub - 116pythonZS/chinese_chatbot_corpus: 中文公开聊天语料库
- 携程酒店自动化360度质量保障体系
- 第四届组织医学与再生医学国际学术研讨会(CTERM-BT 2019)
- xlsxwriter写入Excel
- 解决mongodb 取出时是 UTC时间问题
- 异常来自nbsp;HRESULT:0x80040215
- macOS SwiftUI 指示器组件规范之 02 评级指标 Rating Indicators
- 使用sklearn训练模型出现【DataConversionWarning: A column-vector y was passed when a 1d array was expected】
- 回顾日本和台湾的股市泡沫
热门文章
- Javascript 进阶 作用域 作用域链
- android Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)
- windows下安装docker
- 结构之美——优先队列基本结构(四)——二叉堆、d堆、左式堆
- golang使用gdb
- linux命令ping
- 多线程服务端和客户端通信
- echo服务器(回显服务器)
- C++中#if 0 ... #endif的用法
- Spring AOP学习