最少操作使得数组回文
文章目录
//给定一个数列,每次操作可以选择相邻的两个数,然后用他们的和来替换这两个数,最少需要多少次操作才能使这个数列变为一个回文数列
#include<stdio.h>
#include<iostream>
using namespace std;
bool isHuiwen(int *a,int length){//没有用,判断是否回文
int start=0;
int endd=length-1;
int midd=(start+endd)/2;
if(a[start]!=a[endd])
return false;
while(start<=endd){
if(a[start]==a[endd]){
start++;
endd--;
}
else
break;
}
if(midd==(start+endd)/2)
return true;
}
int minDoCore(int *a,int start,int endd);
int minDo(int *a,int length){
int start=0;
int endd=length-1;
int countt=0;
if(a!=NULL && length>1){
countt=minDoCore(a,start,endd);
}
return countt;
}
int minDoCore(int *a,int start,int endd){
int countt=0;
int min1=0;
int min2=0;
if(start>=endd)
return 0;
else if(a[start]==a[endd])//两端相等
countt= minDoCore(a,start+1,endd-1);
else//两端不相等
{
a[start+1]=a[start]+a[start+1];//左端加
min1=minDoCore(a,start+1,endd)+1;
a[start+1]=a[start+1]-a[start];//恢复左端操作
a[endd-1]=a[endd-1]+a[endd];//右端加
min2=minDoCore(a,start,endd-1)+1;
a[endd-1]=a[endd-1]-a[endd];//恢复右端操作
countt=(min1<=min2)?min1:min2;
}
// if(countt==min1)
// start++;
return countt;
}
int main(){
// int a[]={1,2,3,4,2,1};
// int start=0;
// int endd=5;
// int temp[50];
// while(start<=endd){
// if(a[start]==a[endd]){
// start++;
// endd--;
// }
// else
// break;
// }
// for(int i=0;i<length-start*2;i++){
// temp[i]=a[i+start];
// }
// for(int i=0;i<length-start*2;i++)
// cout<<temp[i]<<" ";
int n;
int a[50];
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
int temp=minDo(a,n);
cout<<temp;
return 0;
}