题目描述
如下是网易17年秋招编程题里的题目
如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:
{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
思路及Python实现
粗看此题可能会不知所措,但题目要求的是求出最少所需的转换次数,这便是我们的一个突破点。
1.首先判断首尾是否相等,如相等则删掉简化后再进行处理
if li[0] == li[last]:
del li[last] #先删除最后一个,再删除第一个
del li[0] #否则就应为del li[0],del li[last-1]
count = dealhw(li,count)
2.不相等则判断首尾大小,总是将小的排在最前
if li[0]>li[last]:
li.reverse() #将最小的放在最前
li[0]=li[0]+li[1]
del li[1]
count+=1
3.返回第一步,递归处理
count=dealhw(li,count) #递归处理
OK,最后照例附上Python实现
#encoding:utf-8
def dealhw(li,count=0):
leng = len(li)
if leng > 1:
last = leng-1
if li[0] == li[last]:
del li[last] #先删除最后一个,再删除第一个
del li[0] #否则就应为del li[0],del li[last-1]
count = dealhw(li,count)
else:
if li[0]>li[last]:
li.reverse() #将最小的放在最前
li[0]=li[0]+li[1]
del li[1]
count+=1
count=dealhw(li,count) #递归处理
return count
num = input()
li = raw_input().split()
li = [int(li[i]) for i in range(int(num))]
print(dealhw(li))
更多样例
更多样例请看这里哟:http://blog.csdn.net/buracag_mc/article/category/6817874