P1028数的计算(骗分篇)

很明显

这是一道递归题目

我一开始也天真的使用未优化的递归计算

但都被TLE

分析一下代码

#include<iostream>
using namespace std;
void flag(int);
int w=1;
int main()
{
    int k,n;
    cin>>n;
    flag(n);
    cout<<w;
 } 
void flag(int v)
 {
     if(v==1) return;
     for(int i=v/2;i>0;i--)
     {w++;flag(i);}
    
 }

简单一分析——O(n)=n^n

。。。。。这个复杂度

但我又不会优化

我参考了一下题解

诶……

我发现了宝藏

搜索打表

我试了试5分钟内没搜完

然后我等不下去了用了优化递归

我草率的发一下搜索范围不完全的一个程序吧

简单改一改上面的

搜索程序

#include <cstdio>
#include <iostream>
using namespace std;
long long flag(int)
int main()
{
cout<<"a[100]={";
for(int i=1;i<=100;i++)
{
cout<<flag(i)<<",";
}
cout<<"}";
}

long long flag(int v)
{
if(v==1) return 1;
long long w=1; 
for(int i=1;i<=v/2;i++) 
w+=flag(i);
return w;
}

打表程序

#include<iostream>
using namespace std;
int main(){
    int n;
    cin>>n;
    int a[100]={1,2,2,4,4,6,6,10,10,14,14,20,20,26,26,36,36,46,46,60,60,74,74,94,94,114,
114,140,140,166,166,202,202,238,238,284,284,330,330,390,390,450,450,524,524,598,
598,692,692,786,786,900,900,1014,1014,1154,1154,1294,1294,1460,1460,1626,1626,
1828,1828,2030,2030,2268,2268,2506,2506,2790,2790,3074,3074,3404,3404,3734,3734,4124,4124,4514,4514,4964,4964,5414,5414,5938,5938,6462,6462,7060,7060,7658,7658,8350,8350,9042,9042,9828,};
cout<<a[n];    
    return 0;
}

(我凭本事打表,凭什么说我骗分)

posted @ 2020-02-03 22:32  ·Iris  阅读(276)  评论(0编辑  收藏  举报