洛谷P1028 数的计算 题解 动态规划入门题

题目链接:https://www.luogu.com.cn/problem/P1028

题目描述

我们要求找出具有下列性质数的个数(包含输入的自然数 \(n\) ):
先输入一个自然数 \(n(n \le 1000)\) ,然后对此自然数按照如下方法进行处理:

  1. 不作任何处理;
  2. 在它的左边加上一个自然数,但该自然数不能超过原数的一半;
  3. 加上数后,继续按此规则进行处理,直到不能再加自然数为止.

输入格式

1个自然数 \(n(n \le 1000)\)

输出格式

1个整数,表示具有该性质数的个数。

问题分析

我们可以使用 动态规划 来解决这个问题。
我们令 \(f[i]\) 表示自然数 \(i\) 能够生成的数的个数,则:
\(f[i] = 1 + \sum_{j=1}^{n/2} f[j]\)
实现代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
int n, f[maxn];
int main() {
    cin >> n;
    for (int i = 1; i <= n; i ++) {
        f[i] = 1;
        for (int j = 1; j <= i/2; j ++)
            f[i] += f[j];
    }
    cout << f[n] << endl;
    return 0;
}

总结:这是一道动态规划入门题,可以用递推、递归做(不过递归做的时候不要忘了开备忘录)。

posted @ 2019-11-29 21:03  quanjun  阅读(174)  评论(0编辑  收藏  举报