题目链接: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)相关推荐

  1. 蓝桥杯 算法训练 数字三角形(最简单的DP)

    传送门 题目描述 如下图示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路径,使该路径所经过的数字的总和最大. ●每一步可沿左斜线向下或右斜线向下走: ●1<三角形行数≤100: ● ...

  2. (蓝桥杯)数字三角形。。(最简单的dp题)

    (图3.1-1)示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大. ●每一步可沿左斜线向下或右斜线向下走: ●1<三角形行数≤100: ●三角形 ...

  3. 来自wzc的简单拓扑dp

    来自wzc的简单拓扑dp(拓扑DP) 题目已经把解决方案给你了,就是拓扑DP(出题人这回没有耍你,真的) 不过我还是莽了两发dijk贪心QAQ,果然错了(毕竟DP弱者,巨贪心)- 正片开始 有向图拓扑 ...

  4. 来自wzc的简单拓扑dp———浙江农林大学第二十届程序设计竞赛暨团体程序设计天梯赛选拔赛(同步赛)

    传送门 题目描述 (良心出题人wzc说这是个简单拓扑dp,它就必然是一个简单拓扑dp,wzc是不会骗人的) wzc在一张拓扑图上,他所在的起始位置被标记为0.除了起始位置外,还有被1到n这n个整数所标 ...

  5. 简单Profibus/DP实验系统的组建

    简单Profibus/DP实验系统的组建 Writed by 远方 DND-DeviceNet 引言: 为了让更多刚接触到Profibus系统的朋友能对Profibus的网络架构及系统运行机制有一个整 ...

  6. 守望者的逃离一道简单的DP

    现在的水平做一些简单的dp问题还是能单刷出来了 1144 守望者的逃离 2007年NOIP全国联赛普及组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解 ...

  7. poj 1192(简单树形dp)

    题意:这题描述看似很复杂, 其实读懂后就是一个相邻点之间连通问题,水题. 解题思路:首先把相邻的点连接起来建立一棵树,dp[i][0]表示不选择i节点可以得到的最大价值,dp[i][1]表示选择i节点 ...

  8. poj 3280(简单区间dp)

    题意:将一个字符串转换成回文串的最小花费. 解题思路:简单的区间dp,dp[i][j]表示从i到j的字符串转换成回文串的最小化费. #include<iostream> #include& ...

  9. 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 次能得到的最长回文子序 ...

最新文章

  1. 如何使‘CREATE TABLE AS SELECT’能支持ORDER BY ?
  2. 大四生活总结20101015
  3. java 颜色比较_我该如何比较Java中的颜色?
  4. 架构师之路(1)---面向过程和面向对象
  5. java 解析 manifest_解析AndroidManifest.xml之AXMLParser.java | 学步园
  6. c++builder 运行网站的api_04 将您的API Builder Docker映像发布到AMPLIFY运行时服务(ARS)...
  7. 苹果公布App审查新机制 禁止发布疫情相关娱乐程序和游戏
  8. 距离向量路由算法及举例
  9. 关于array.sort(array,array)
  10. Python 语言程序设计(4-2)分支循环--无限循环
  11. lnmp php 5.4,linux下搭建LNMP(linux+nginx+mysql+php)环境之php5.4安装
  12. python中文聊天_GitHub - 116pythonZS/chinese_chatbot_corpus: 中文公开聊天语料库
  13. 携程酒店自动化360度质量保障体系
  14. 第四届组织医学与再生医学国际学术研讨会(CTERM-BT 2019)
  15. xlsxwriter写入Excel
  16. 解决mongodb 取出时是 UTC时间问题
  17. 异常来自nbsp;HRESULT:0x80040215
  18. macOS SwiftUI 指示器组件规范之 02 评级指标 Rating Indicators
  19. 使用sklearn训练模型出现【DataConversionWarning: A column-vector y was passed when a 1d array was expected】
  20. 回顾日本和台湾的股市泡沫

热门文章

  1. Javascript 进阶 作用域 作用域链
  2. android Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)
  3. windows下安装docker
  4. 结构之美——优先队列基本结构(四)——二叉堆、d堆、左式堆
  5. golang使用gdb
  6. linux命令ping
  7. 多线程服务端和客户端通信
  8. echo服务器(回显服务器)
  9. C++中#if 0 ... #endif的用法
  10. Spring AOP学习