4 条题解

  • 0
    @ 2023-2-25 11:42:59
    #include <bits/stdc++.h>
    using namespace std;
    int book[1000000+5]; //创建一个列表来存变量 
    int f(int x)//递归算一下 
    {
    	if(book[x]!=-1)
    		return book[x];
        if (x == 1)//因为题目要求,把0改成1 
            return 1;
        if (x == 2)
            return 1;
        book[x] = (f(x - 1) + f(x - 2))%1000;//这个是那个记忆化 
        return book[x];
    }
    int main()
    {
    	for(int i=1;i<=1000000;i++)//按照题目要求出另外几个输出数据 
    		book[i] = -1; 
        int n;
        int T;
        cin>>T;
        for(int i=1;i<=T;i++){
    	    cin >> n;
        	cout << f(n) % 1000 << "\n";
    	}
    	return 0;
    }
    
    • 0
      @ 2023-2-25 11:29:42
      #include <bits/stdc++.h>
      using namespace std;
      int book[1000000+5]; //记忆化,book[i] 记住斐波那契数列第i项 
      //返回数列第 x 项
      int f(int x)
      {
      	if(book[x]!=-1)
      		return book[x];//之前算过就直接返回 
          if (x == 1)
              return 1;
          if (x == 2)
              return 1;
          book[x] = (f(x - 1) + f(x - 2))%1000;//算完后先别返回,先记下来 
          return book[x];
      }
      int main()
      {
      	//一开始把本子清空 
      	for(int i=1;i<=1000000;i++)
      		book[i] = -1; 
          int n;
          int T;
          cin>>T;
          for(int i=1;i<=T;i++){
      	    cin >> n;
          	cout << f(n) % 1000 << "\n";
      	}
      	return 0;
      }
      
      • 0
        @ 2022-9-30 18:14:34

        代老师云:本题的记忆化搜索也可以使用递归做

        感谢代老师对代码的认真指导、修改 ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️

        打表递推代码(基本的for循环):

        #include<bits/stdc++.h>
        using namespace std;
        int book[1000010]={0};
        int n;
        int main()
        {
        	for(int i=0;i<=1000005;i++)
        		book[i]=-1;
        //初始化;注意一定要为不可能的数字,如果初值为0的话会出问题的!(别问我怎么知道的)
        	book[1]=1,book[2]=1;
        //1、2两个数字均为1
        	for(int i=3;i<=1000000;i++)
        		if(book[i]==-1)
        			book[i]=(book[i-1]+book[i-2])%1000;
        //如果第i个数字不为-1,即没有使用过(其实不需要也可以不是吗),进行运算
        //从1-1000000次循环确实有点暴力了
        	cin>>n;
        	for(int i=1;i<=n;i++)
        	{
        		int x;
        		cin>>x;
        		cout<<book[x]<<'\n';
        //直接输出数组相应位数
        	}
        	return 0;
        }
        
        • 0
          @ 2022-9-29 21:01:01
          #include <bits/stdc++.h>
          using namespace std;
          //记忆化递归:book[i] 记住第 i 项的值
          int book[1000005];
          //返回数列第 x 项
          int f(int x)
          {
              //如果之前算过了,这次就不再计算了
              if (book[x] != -1)
                  return book[x];
              if (x == 1)
                  return 1;
              if (x == 2)
                  return 1;
              //返回之前记录一下算出来的数
              book[x] = (f(x - 1) + f(x - 2)) % 1000;
              return book[x];
          }
          int main()
          {
              ios::sync_with_stdio(false);
              cin.tie(0);
              //把小本子上的东西清空
              //如果本子上记的是 -1 就说明之前没算过
              memset(book, -1, sizeof(book));
              int t, n;
              cin >> t;
              while (t--)
              {
                  cin >> n;
                  cout << f(n) << endl;
              }
              return 0;
          }
          
          • 1

          信息

          ID
          408
          时间
          1000ms
          内存
          128MiB
          难度
          6
          标签
          (无)
          递交数
          187
          已通过
          60
          上传者