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; }
(我凭本事打表,凭什么说我骗分)