题:
给一数组,从中找出一个最长序列,使得序列最长,并保持一下性质:
1.序列是回文,例如aba
2. 序列中的数之间的相对位置不变
3.序列中的数不要求相邻
举例:
a = [1, 3 ,4 ,5,6 ,5,3 ,3 ,1]
最长的是 1 3 5 6 5 3 1 ,输出4 ,即半径
解决办法:
首先从begin 和end 开始比较,如果相等,begin 和end个加一,不等则处理两种情形,(begin+1,end不变)和(begin不变,end-1)取其中最长的,显然我们想到这是个递归的过程
代码如下:
#include <iostream>
using namespace std;
int max(int x,int y)
{
return x>y?x:y;
}
int recur_find(int *p_a, int begin,int end)
{
cout<<"begin is "<<begin <<"end is "<<end<<endl;
int m_begin = begin;
int m_end = end;
int count= 0 ;
while((p_a[m_begin]==p_a[m_end])&&(m_begin<m_end))
{
count ++;
m_begin++;
m_end--;
cout<<"m_begin is "<<m_begin <<"m_end is "<<m_end<<endl;
}
if( m_begin ==m_end)count++;
if(p_a[m_begin]!=p_a[m_end])
{
return count+max(recur_find(p_a,m_begin,m_end-1),recur_find(p_a,m_begin+1,m_end));
}
return count;
}
void main()
{
int **p;
int m;
int *n ;
cin>>m;
p = new int*[m];
n = new int [m];
for (int i = 0 ;i<m;i++)
{
cin >>n[i];
p[i]= new int[n[i]];
for(int j = 0 ;j<n[i];j++){
cin >>p[i][j];
}
}
for (int i = 0 ;i<m;i++)
{
cout<<recur_find(p[i],0,n[i]-1)<<std::endl;
}
system("pause");
}