如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:
{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列,
{1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。
现在给出一个数字序列,允许使用一种转换操作:
选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和)。
{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列,
{1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。
现在给出一个数字序列,允许使用一种转换操作:
选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和)。
现在对于所给序列要求出最少需要多少次操作可以将其变成回文序列。
思路:利用递归,两端不论怎样都要相等或者最终合成为同一个数
C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
#include<stdio.h> #include<stdlib.h> #include<math.h> #include <iostream> using namespace std; int result(int *data, int head, int trail) { int times = 0; int left = data[head]; int right = data[trail]; while (head < trail && left != right) { if (left < right) { left = left + data[++head]; times++; } else { right = right + data[--trail]; times++; } } if (head >= trail) return times; else return times + result(data, ++head, --trail); } int main() { int data[30] = {0}; int n; int i; printf("请输入序列个数\n"); scanf("%d", &n); for (i = 0; i < n; i++) scanf("%d",&data[i]); printf("%d\n", result(data, 0, n - 1)); system("pause"); } |