题目链接 | 难度等级 | 完成状态 | 完成分数 | 最后编辑时间 | 失误原因(初次提交分数) |
---|---|---|---|---|---|
数的计算(NOIP2001) | ★☆☆☆☆ | 答案正确 | 100 | 2014/10/02 23:14:02 | 变量打错(75) |
原题描述本来就很裸了,但是要特别注意下第三点:按规则处理,所谓原数的一半是指最开始的n而不是后来得到的数。
其它就按原题理解应该没什么问题。
题目的分类是递推,那就从递推说起。递推式容易得到:
f[1]=1; f[n]=f[1]+f[2]+...+f[n/2]+1;
从1循环到n就好,由于测试数据较水两层循环的版本已经可以AC了,。(当然毕竟是01年的题目用现在的机器跑....)
递推的最简单优化方式就是再加一个数组记录前n项和优化,可以优化到。
递推就不写了。
接下来是搜索,暴搜也能过,然后优化可以加一个数组存储最优值,记忆化搜索,详见代码。
1011搜索.cpp代码已折叠
展开折叠内容
|
---|
#include<iostream> using namespace std; int dfs(int n) { int c=0; if(n==1) return 0; for(int i=1;i<=(n>>1);++i) c+=dfs(i)+1; return c; } int main() { int n=0; cin>>n; cout<<dfs(n)+1; return 0; } |
1011记忆化搜索.cpp代码已折叠
展开折叠内容
|
---|
#include<iostream> using namespace std; int c[1001]={}; int dfs(int n) { if(n==1) return 0; for(int i=1;i<=(n>>1);++i) { if(c[i])c[n]+=c[i]+1; else c[n]+=dfs(i)+1; } return c[n]; } int main() { int n=0; cin>>n; cout<<dfs(n)+1; return 0; } |