问题描述:
如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。
例如:
{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列,
{1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。
现在给出一个数字序列,允许使用一种转换操作:
选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和)。
现在对于所给序列要求出最少需要多少次操作可以将其变成回文序列。

输入描述:
输入为两行,第一行为序列长度n ( 1 ≤ n ≤ 50) 第二行为序列中的n个整数item[i] (1 ≤ iteam[i] ≤ 1000),以空格分隔。

输出描述:
输出一个数,表示最少需要的转换次数
示例

输入
4 1 1 1 3
输出
2

问题分析:每次加两个数,并将两个数之和代替前一位而删除后一位,求出使输入的序列变为回文序列的最少次数
算法设计:要使序列变为回文则正序与逆序序列相同,所以第一个必须是等于最后一个的,因为每次操作只能对连续的两个数进行操作,所以如果第一个与最后一个不相同的话 必须要与邻近的一个数相加,操作次数加一,若相同的话则与第一个和最后一个无关,将其去掉,问题规模减小,直到最后只剩一个数或0个数
算法实现:

// 190916-class_递归_回文序列.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include<vector>
using namespace std;int trans(vector<int> v);int main()
{int n,x;cin >> n;vector<int> v;for (int i = 0; i < n; i++){cin >>x;v.push_back(x);//将x加到向量里}cout << trans(v) << endl;
}int trans(vector<int> v)
{int k = 0, len = v.size();if (len <= 1)return k;if (v[0] == v[len - 1]){v.erase(v.begin());v.erase(v.end() - 1);}else if (v[0] < v[len - 1]){v[1] += v[0];v.erase(v.begin());k++;k += trans(v);}else{v[len - 2] += v[len - 1];v.erase(v.end() - 1);k++;k += trans(v);}return k;
}

运行结果:
算法分析:了解回文的特点,顺序逆序相同,所以一个回文序列前后必须相同,不妨就从前后入手,因为若前后不同则无法避免要相加,这样下来操作都是必须的则操作数就是最小的,若前后已经相同,则前后已与是否构成回文序列无关,从而可以采取递归的方法每一轮后将问题转换为规模更小的问题
**经验归纳:**思考时寻找一个入手点,若所有操作都是必须的,则操作数就一定是最小操作数

c++ 使用递归求解回文序列问题相关推荐

  1. Py:递归求解汉诺塔,简单的几行编程可以搞定很高层的三柱汉诺塔游戏

    Py:递归求解汉诺塔,简单的几行编程可以搞定很高层的三柱汉诺塔游戏 目录 输出结果 核心代码 输出结果 核心代码 def hanoi(n,x,y,z):if n==1:print(x,'--→',z) ...

  2. 用栈和递归求解迷宫问题

    一.问题概述 小时候,我们都玩过走迷宫的游戏吧.看一下这个图例: 遇到这种问题时,我们第一反应都会先找到迷宫的入口点,然后对上下左右四个方向进行寻迹, 检测当前位置是否是通路,是否可以通过,直至找到出 ...

  3. C语言(CED)王老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数(递归求解)

    (请先看置顶博文)https://blog.csdn.net/GenuineMonster/article/details/104495419 题目大意:王老师爬楼梯,他可以每次走1级或者2级,输入楼 ...

  4. C语言(CED)对于一个2行N列的走道。现在用1*2,2*2的砖去铺满。问有多少种不同的方式(递归求解)

    又涉及到递归问题,这道题的大致内容是这样的: (请用递推方式求解)对于一个2行N列的走道.现在用1*2,2*2的砖去铺满.问有多少种不同的方式.下图是一个2行17列的走道的某种铺法. 提示:观察前n个 ...

  5. 2014递归求解单链表中的平均值(C++,附递归函数思路讲解)

    描述 利用单链表表示一个整数序列,利用递归的方法计算单链表中各个结点的平均值. 输入 多组数据,每组数据有两行,第一行为链表的长度n,第二行为链表的n个元素(元素之间用空格分隔).当n=0时输入结束. ...

  6. 动态规划java LCS_动态规划递归求解LCS长度 | 学步园

    这个问题的叙述太多了,就不重复了.这里我只是球出了LCS的长度,事实上,长度还是非常有用的,如判断两个字符串相似程度.主要是想说明的是,利用递归来求解.非常方便.今天下午了试了3个题,一个回文数,一个 ...

  7. matlab求递归问题,matlab利用递归求解差分方程

    导航:网站首页 > matlab利用递归求解差分方程 时间:2018-5-23 matlab利用递归求解差分方程 function y = recur(a,b,n,x,x0,y0); % % y ...

  8. 【数据结构】带动画显示过程的递归求解迷宫问题

    采用递归算法求解迷宫问题,输出从入口到出口的所有路径. 递归求解我真的也不是理解的很透,但是明显感觉到递归和栈.队列求解很像,都是树形的搜索过程. 为了直观地观察过程,补充了一个动画过程,可以用来观察 ...

  9. 汉诺塔问题的递归求解

    汉诺塔问题的递归求解 汉诺塔 解题思路 具体实现 汉诺塔 汉诺塔 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱 ...

最新文章

  1. python label textvariable_在子窗口中为标签的textvariable赋值失败时,有关,给,Label,问题...
  2. CodeForces - 1422D Returning Home(最短路+思维建图)
  3. 不要在nodejs中阻塞event loop
  4. MyEclipse6.5与Perforce的集成
  5. 大佬为何可以把单片机描述得如此形象生动?
  6. 格式化代码php,格式化php代码的两种方法
  7. linux 文件描述符
  8. 朴素贝叶斯-垃圾邮件(中文的)处理
  9. springBoot项目启动后无法访问index.html首页或其它controller
  10. 200个化工网站批量爬取
  11. b站 前端构架_技术干货:哔哩哔哩(B站)功能框架图
  12. 基于物理的渲染:从理论到实现 PBRT 中文整合翻译计划
  13. 排课系统asp源代码_高校教务排课系统源代码及全套资料.doc
  14. 简历在线制作计算机,简历在线生成,在线生成PDF或word格式简历
  15. 40年开店近4万家,麦当劳老大地位恐不保!看看人家这心机!
  16. 使用ZED相机录制事件双目数据集
  17. 跑动大数据的笔记本配置_大数据专业用什么样的笔记本合适?
  18. 什么是绩效点、奖励加分、处罚扣分
  19. java 山寨qq源代码_求一个山寨qq的源代码,要java语言的~谢谢
  20. DNSPod十问梁定安: 工业互联网唤醒制造业的第二个春天

热门文章

  1. 浅谈AS2 传输/连接
  2. 【PPP概念股龙头】PPP再迎风口 相关概念股表现格外抢眼(2)
  3. Linux环境变量profile
  4. 跨时钟域传输和Verilog代码
  5. MTI动目标指示和MTD动目标检测
  6. PS里面的快速选区工具
  7. mysqladmin
  8. matlab kml批量转为shp文件,arcpy实现 kml批量转出为shp
  9. selenium 校园网自动连接
  10. 计算机科学与技术8G够,高手们.请问8G物理内存设置多少虚拟内存适合