递推之摆动数列

来源:互联网 发布:源码包安装php 编辑:程序博客网 时间:2024/05/05 15:48
  1. 问题描述
    已知递推数列:a(1)=1,a(2i)=a(i)+1,a(2i+1)=a(i)+a(i+1),(i为正整数),试求该数列的第n项与前n项中哪些项最大?最大值为多少?。

  2. 算法分析
    该数列分项序号为奇或偶两种情况作不同递推,所得数列呈大小有规律的摆动.
    设置a数组,赋初值a(1)=1.根据递推式,在循环中分项序号i(2─n)为奇或偶作不同递推:
    mod(i,2)=0(即i为偶数),a(i)=a(i/2)+1.
    mod(i,2)=1(即i为奇数),a(i)=a((i+1)/2)+a((i-1)/2)
    每得一项a(i),与最大值max作比较,如果a(i)>max,则max=a(i).
    最后,在所有项中搜索最大项(因最大项可能多于一项),并打印最大值max.

  3. 程序代码
#include <iostream>using namespace std;int main(){    int n;    cin >> n;    int* arr = new int[n+1];    arr[1] = 1;     int max = arr[1];     for (int i=2; i<=n; ++i)    {        if (i%2 == 0)   //偶数        {            arr[i] = arr[i/2] + 1;         }        else            //奇数         {            arr[i] = arr[(i-1)/2] + arr[(i+1)/2];         }        if (arr[i] > max)        {            max = arr[i];         }    }    cout << arr[n] << endl;     for (int i=1; i<=n; ++i)    {        if (arr[i] == max)        {            printf("arr[%d]=", i);         }    }    cout << max << endl;    delete[] arr;     return 0;}
0 0
原创粉丝点击