2 条题解

  • 0
    @ 2025-7-3 11:08:40

    O(n)做法

    #include <bits/stdc++.h>
    using namespace std;
    long long a[1000006],n;
    int main() {
    	cin>>n;
    	a[1]=1;
    	a[0]=1;
    /*
    要问为什么a[0]也要预处理,因为1/2放在int类型会强制转换成0
    */
    	for(int i=2;i<=n;i++){
    		a[i]=a[i-2]+a[i/2];//递推
    	}
    	cout<<a[n];//输出
    	return 0;
    }
    /*
    0  1
    1  2   a[1-2]+a[1/2]
    2  2   a[2-2]+a[2/2]
    3  2   a[3-2]+a[3/2]
    4  4    ……………… 
    5  4
    6  6
    7  6
    */
    
    • 0
      @ 2022-7-27 11:22:52
      这题可以用递推做
      #include<bits/stdc++.h>
      using namespace std;
      long n,i,j,s,f[1005];
      int main()
      {
      	cin>>n;
          for(i=1;i<=n;i++)
          {
              f[i]=1;//本身
              for(j=1;j<=i/2;j++)//到i的一半
                  f[i]+=f[j];//每次累加
          }
          cout<<f[n];
      	return 0;
      }
      记忆化版
      不加记忆化90!
      震惊了我都,数据太水!
      #include<bits/stdc++.h>
      using namespace std;
      long n,i,j,s,f[1005];
      long dg(long n)
      {
      	if(n==1)return 1;
      	long s=1,i;
      	for(i=1;i<=n/2;i++)//思路很简单
      	{
      		if(!f[i]){
      			s+=dg(i);
      			f[i]=dg(i);//记忆化
      		}
      		else s+=f[i];//出现过直接调用
      	}
      	return s;
      }
      int main()
      {
      	cin>>n;
      	cout<<dg(n);
      	return 0;
      }
      • 1

      信息

      ID
      59
      时间
      1000ms
      内存
      256MiB
      难度
      2
      标签
      (无)
      递交数
      40
      已通过
      26
      上传者