辣妹米斯达 2019-11-02 11:38 采纳率: 0%
浏览 321

递归的记忆性,防止出现TLE

该图是数据测试的输出结果,输入为131,结果正常
该图也是数据测试,输入为262,即131的两倍,结果就爆了

这是一道洛谷的题目,题面是如下:
图片说明

我采用的是递归算法,在数据较小的情况是没问题的。以下是无记忆性代码:

#include <bits/stdc++.h>
using namespace std;

int cnt=0;

int main()
{
    int n;
    cin>>n;
    void whatever(int n);
    whatever(n);
    cout<<cnt;
}

void whatever(int n)
{
    cnt++;
    if(n==1)    return;
    for(int i=1;i<=n/2;i++) whatever(i);
}


//---------------------------------------------------------

以上代码会出现超时的问题(因为递归的重复运算),而以下代码则是出现如上图的数值突然爆了的情况,求解。

//---------------------------------------------------------

#include <bits/stdc++.h>
using namespace std;

bool mark[105];
long int sto[105];
int whatever(int n)
{
    if(n==0)  {mark[0]=1; sto[0]=0; return 0;}
    if(mark[n]==false)   //haven't traveled it
    {
         mark[n]=true;      //marking it to be traveled one
         sto[n]=1;
    }
    else return sto[n];
    if (n==1) return 1;
    for(int i=0;i<=n/2;i++)
    {
        if(mark[i]==false)
        {
            sto[n]+=whatever(i);
            cout<<"sto["<<i<<"] is: "<<sto[i]<<"    whatever("<<i<<") is: " <<whatever(i)<<endl;
        }
        else
        {
            sto[n]+= sto[i];
        }

    }
    return sto[n];
}


int main()
{
    int n;
    long int sum;
    cin>>n;
    sum=whatever(n);
    cout<<n<<"对应是: "<<sum;
}




  • 写回答

1条回答 默认 最新

  • dabocaiqq 2019-11-02 12:27
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 CSS实现渐隐虚线框
  • ¥15 有没有帮写代码做实验仿真的
  • ¥30 vmware exsi重置后登不上
  • ¥15 易盾点选的cb参数怎么解啊
  • ¥15 MATLAB运行显示错误,如何解决?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题
  • ¥20 yolov5自定义Prune报错,如何解决?
  • ¥15 电磁场的matlab仿真