回 帖 发 新 帖 刷新版面

主题:第31次比赛第1题_题目

一系列整数 (a[1],a[2],a[3], ..., a[n]),如果数列(a[i],a[i+1],a[i+2]…… a[k])满足a[i]<a[i+1]<a[i+2]<…… <a[k]则称为递增数列。
如果(a[i],a[i+1],a[i+2]…… a[k])中所有元素都属于数列(a[1],a[2],a[3], ..., a[n]),则称数列(a[i],a[i+1],a[i+2]…… a[k])为数列
(a[1],a[2],a[3], ..., a[n])的子数列。
----------------------------------
问题:
   给一长度为len的整型数列(array[1],array[2],array[3], ..., array[len]),求该数列中最长的子递增数列的长度.
   其中,-1000<=a[i]<=1000,1<=len<=1000
----------------------------------
函数接口:
       int maxclarray(int *array,int len);
       接口说明:
               array----整型数列的首地址
               len------整型数列的长度
               返回值---最长的子递增数列的长度
----------------------------------
如:
  a[]={1,-2,1,2,1},len=5; 返回3

  a[]={1,-2,-11,-2,1},len=5; 返回3

  a[]={1,-2,-3,-4,-5,-6,-7},len=7; 返回1

  a[]={1},len=1; 返回1

-----------------------------------

有什么疑问,可以在"关于31次比赛第1题"贴提出

------------------------------------

最后,祝大家周末愉快!!!1

回复列表 (共20个回复)

沙发

int maxclarray(int *array,int len)
{
    if(!array || len == 0) return 0;
    int ret = 1, tmp = 1;
    for(int i = 0; i < len; ++i)
    {
        if(i != len-1 && array[i] < array[i+1]) ++tmp;
        else { ret = tmp > ret ? tmp : ret; tmp = 1;}
    }
    return ret;
}

板凳


//听说有O(nlogn)的算法,但是我不会,所以就写了个O(n^2)的

int maxclarray(int *array,int len)
{
    int *p,i,j,max;
    p = new int[len];
    for(i = len-1; i >= 0;i--)
    {
        max = 0;
        for(j = i+1;j < len;j++)
            if(array[j] > array[i] && p[j] > max)max = p[j];
        p[i] = max+1;
    }
    max = 0;
    for(i = 0; i < len;i++)
        if(p[i] > max) max = p[i];
    delete[]p;
    return max;
}

3 楼

int maxclarray(int *array, int len)
{
   int length[1000], i, j, max = 0;
   for (i = 0; i < len; i++)
   {
      length[i] = 0;
      for (j = i - 1; j >= 0; j--)
      {
         if (array[i] < array[j] && length[j] + 1 > length[i])
         {
            length[i] = length[j] + 1;
            if (length[i] > max)
                max = length[i];
         }
      }
   }
   return max;
}

4 楼


int maxclarray(int *array,int len){
    int *tmp=new int[len];
    int s,max_s=1,k;
    for(int i=len-1;i>=0;i--){
        s=1;
        for(int j=i+1;j<len;j++){
            k=1;
            if(array[i]<array[j]){
                k+=tmp[j];
                if(k>s)
                    s=k;
            }
        }
        tmp[i]=s;
        if(s>max_s)
            max_s=s;
    }
    return max_s;
}

5 楼

int maxclarray(int *a,int len)
{
    int max=1;
    int temp=1;
    for(int i=0;i<len-1;++i)
    {
        if(a[i+1]>a[i])
            ++temp;
        else if(len-i<=temp)
            break;
        else if(temp>max)
        {
            max=temp;
            temp=1;
        }
    }
    if(temp>max)
        max=temp;
    return max;
}

6 楼

int maxclarray1(int *a,int len)
{
    int max=0;
    int start=0;
    for(int i=0;i<len-1;++i)
    {
        if(a[i+1]>a[i])
            continue;
        else if(i-start>max)
        {
            max=i-start+1;
            start=i;
        }
        else
            start=i+1;
    }
    if(len-start>max)
        return len-start;
    return max;
}

7 楼

int maxclarray(int *array,int len)
{
  int max=1,i=0,temp=1;
  for (i=0;i<len-1;i++)
  {
    if(array[i]<array[i+1])
        temp++;
    else 
        temp=1;
    if(temp>max)
         max=temp;
  }
  return max;
}

8 楼

int maxclarray(int *array,int len)
{
 int CurrentValue=array[len-1],CurrentPos=0,maxLen=0,CurrentLen=0;
 while(CurrentPos<len)
 {
  if(CurrentValue<array[CurrentPos]||CurrentPos==0)
  {
   CurrentLen++;
  }
  else
  {
   if(CurrentLen>maxLen) maxLen=CurrentLen;
   CurrentLen=1;
  }
  CurrentValue=array[CurrentPos];
  CurrentPos++;
 }
 if(CurrentLen>maxLen)  maxLen=CurrentLen;
 return maxLen;
}


Dev-C++ 下编译通过

9 楼

/*一次走过全部数组,
  但是数据之间的交换比较多,定义的变量也比较多。
  希望能看到数据交换更少,使用变量更少得程序。
  给出的程序的函数部分。
  希望大家指正。
*/
int maxclarray(int *array,int len)
{
    int i,length=1,head,end,count=0;

    for(i=0;i<len-1;i++)
    {
        head=*(array+i);
        end=*(array+i+1);
        if(head < end)
        {
            length++;
        }else
        {
            if(count < length)
                count=length;
            length=1;
        }
    }
    return count;
}

10 楼

int maxclarray(int *array,int len)
{
      int *t;//存储以a[i]为末元素的最长递增子序列长度
      if (!(t = new int[len]))
      {
            cout << "fail!\n";
            exit(1);
      }

      t[0]=1;//以a[0]为末元素的最长递增子序列长度为1;
      for (int i=1; i<len; i++)//循环num-1次
      {
            t[i]=1;//t[i]的最小值为1;
            if (array[i-1] < array[i])
                  t[i] = t[i-1]+1;//更新t[i]的值。
      }

      int max = 1;
      for (int i=1; i<len; i++)
            max = (max > t[i]) ? max : t[i];
      delete []t;

      return max;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册