文章目录

//给定一个数列,每次操作可以选择相邻的两个数,然后用他们的和来替换这两个数,最少需要多少次操作才能使这个数列变为一个回文数列

#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;
}
文章目录