回文序列
题目
如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:
{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:
包含两个函数:
isHuiwen(li) 判断列表是否是回文
dealHuiwen(li) 回文处理,分析每一种可能,将列表处理成回文
这种方法便于理解,在遇到这种问题是首先就会想到这样处理
但是这种方法遍历,需要消耗很多时间和内存去处理每种可能性
#########################################
#判断是否是回文
def isHuiwen(li):
leng = len(li)
flag =True
for i in range(0,leng//2):
#如果第i个和第leng-1-i个不相等,说明就不是回文
if li[i]!=li[leng-1-i]:
flag =False
break
return flag
#########################################
#迭代加递归
#尝试每一种可能性,返回最小的那个
def dealHuiwen(li,count=0):
#如果是回文,返回处理次数
if isHuiwen(li):
return count
else:
leng = len(li)
count_li=[]
count+=1
#先迭代,尝试每一种可能性,将每个可能的列表作为递归的初始列表
#每种可能都会返回一个count,取最小的一个
for i in range(0,leng-1):
li2=li[:]#从原来的列表中复制一份
li2[i]=li2[i]+li2[i+1]
del li2[i+1]
count_li.append(dealHuiwen(li2,count))
return min(count_li)
#########################################
count = input()#输入个数
string = input()#输入数据,在python2.X中要改为raw_input()
li=string.split(' ')#将输入的字符串数据以' '分割成列表
#将str型转化为Int型
for i in range(0,int(count)):
li[i] = int(li[i])
#打印结果
print(dealHuiwen(li))
python解答2
只用了一个函数dealHuiwen(li,count)
这个函数会对列表进行简化处理,不用每次都去判断首尾是否相等
这个函数关注将不相等的首尾处理成相等,相等以后再简化
不断的简化,最后整个列表会只剩一个元素或0个元素
#这种方法根据回文的特性去处理
#1.判断列表第0个和列表最后一个是否相等
# 若相等,可去掉list[0]和list[last]做简化出来
# 若不相等,要形成回文的话,一定要使得list[0]==list[last]为True
# 当list[0]>list[last]时,对list进行逆序,这样方便以后只要对list[0]和list[1]处理
# 这样来回的对list[0]和list[last]操作,最后list[0]=list[last]
def dealHuiwen(li,count=0):
leng = len(li)
if leng>1:
last=leng-1
if li[0]==li[last]:
del li[0]
del li[last-1]#此时li[last]在li[last-1]的位置
count = dealHuiwen(li,count)#简化后,再进行递归处理
else:
if li[0]>li[last]:
li.reverse()#逆序,总是将最小的放在最前
li[0]=li[0]+li[1]
del li[1]
count+=1
count=dealHuiwen(li,count)
return count
#################################################
num=input() #输入数据,在python2.x中用raw_input()
string=input() #输入数据,在python2.x中用raw_input()
li=string.split(' ')
for i in range(0,int(num)):
li[i]=int(li[i])#转化为Int
print(dealHuiwen(li))
C语言解答:
这里的解法和python解法2是一样的
这里多需要两个辅助函数
1.int delListItem(int list[],int *len,int index)删除数组中的一个元素
2.void reverseList(int list[],int len)将数组逆序
3.int dealHuiwen(int list[],int *len ,int count)回文处理函数
#include<stdio.h>
#define MAX 500
/*
-----------------------
删除下标为index的一个元素
返回数组元素个数
-----------------------
*/
int delListItem(int list[],int *len,int index)
{
int i ;
for(i=index ;i<*len-1 ;i++)
list[i] =list[i+1] ;
*len=*len-1;
return *len ;
}
/*
------------------------
数组逆序
------------------------
*/
void reverseList(int list[],int len)
{
int mid = (int)(len/2) ;
int i ;
int temp ;
for(i=0 ; i<mid ;i++)
{
temp = list[i];
list[i] = list[len-1-i];
list[len-1-i] = temp ;
}
}
/*
--------------------------
回文的处理函数
--------------------------
*/
int dealHuiwen(int list[],int *len ,int count)
{
int last = *len-1 ;
//确保数组中有两个或两个以上的元素
//如果只有一个或0个那肯定就是回文,直接返回就是
if(*len>1)
{
//若list[0]=list[last],则可以简化
if(list[0]==list[last])
{
delListItem(list,len,0);
delListItem(list,len,last-1);
count = dealHuiwen(list,len,count);
}
else
{
if(list[0]>list[last])
reverseList(list,*len);
list[0]=list[0]+list[1] ;
delListItem(list,len,1);
count++ ;
count=dealHuiwen(list,len,count) ;
}
}
return count;
}
/*
--------------------------
主函数
--------------------------
*/
int main()
{
int len =0 ;
int count =0 ;
int list[MAX] ;
int i ;
scanf("%d",&len) ;
for(i=0 ;i<len ;i++)
scanf("%d",&list[i]);
count = dealHuiwen(list,&len,count);
printf("%d",count);
return 0;
}