题目描述 Description
我们要求找出具有下列性质数的个数(包含输入的自然数n):
先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理:
1. 不作任何处理;
2. 在它的左边加上一个自然数,但该自然数不能超过原数的一半;
3. 加上数后,继续按此规则进行处理,直到不能再加自然数为止.
输入描述 Input Description
一个数n
输出描述 Output Description
满足条件的数的个数
样例输入 Sample Input
6
样例输出 Sample Output
6
数据范围及提示 Data Size & Hint
6个数分别是:
6
16
26
126
36
136
好久不做记忆化递归的题了,刷天梯正好遇到这题……
刚开始想递归还怕超时,后面感觉记忆化应该可以,然后就写了,试了最大的n=1000秒出才放心……
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<queue> #include<set> #include<cmath> #include<bitset> #define mem(a,b) memset(a,b,sizeof(a)) #define lson i<<1,l,mid #define rson i<<1|1,mid+1,r #define llson j<<1,l,mid #define rrson j<<1|1,mid+1,r #define INF 1000000007 #define seed 13131 #define seed1 1313 #define maxn 500005 typedef long long ll; typedef unsigned long long ull; using namespace std; ll a[1005]; ll dfs(int n) { if(!n||n==1) return 0; if(a[n]) return a[n]; ll sum=n/2; for(int i=n/2;i>1;i--) sum+=(a[i]=dfs(i)); return sum; } int main() { int n; cin>>n; cout<<dfs(n)+1<<endl; return 0; }
时间: 2024-10-16 06:27:55