专栏文章

题解:P1028 [NOIP 2001 普及组] 数的计算

P1028题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miq56xen
此快照首次捕获于
2025/12/03 23:08
3 个月前
此快照最后确认于
2025/12/03 23:08
3 个月前
查看原文
最基础的DP
第一眼看到这题其实很容易想到dfs,但是O(2^N)很明显过不了
这时候,我们就需要引进一个新的概念
动态规划
简单的来说,就是优化到极致的搜索。
在研究这个问题之前,我们来讨论一下,为啥搜索这么慢
因为过于多的重复搜索(就是所谓的殊途同归)
我们发现要优化它很简单,居然很多重复搜索,那我开一个数组来维护状态,那么下一次遍历时,直接调用。 当然我们要满足一件事我在第 i 步时的选择,不会影响到 i 步之后(无后效性)
那么这题就呼之欲出了,我们选择从后往前递推设fif_i为当前数列第一个数为 i 的数列个数。
那么
fn1=i=1nn2f_n-1 = \sum_{i = 1}^{n} \frac{n}{2}
代码:
CPP
#include <bits/stdc++.h>
using namespace std;
int n,f[1005];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		f[i]=1;
		for(int j=i/2;j>=1;j--)f[i]+=f[j];
	}
	cout<<f[n];
	return 0;
}
时间复杂度O(N^2),空间复杂度O(N),可以通过此题。

评论

0 条评论,欢迎与作者交流。

正在加载评论...