递归不行就换动态规划(洛谷P1028题题解,Java语言描述)

题目要求

P1028题目要求
在这里插入图片描述

分析

我们可以用递归做,但可能会超时或者超内存。最起码不算好的算法。

那么我们就可以考虑找到递推规律,利用简单的DP处理。

在迭代的时候发现:(i >= 2)
i为偶数的时候,存在:f(i) = f(i-1) + f(i/2)
i为奇数的时候,存在:f(i) = f(i-1)

做一下简单模拟:
n = 0, result = 1;
n = 1, result = 1;
n = 2, result = 2;
n = 3, result = 2;
n = 4, result = 4;
n = 5, result = 4
n = 6, result = 6;
n = 7, result = 6;

符合我们所写的方程。

AC代码(Java语言描述)

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        int[] f = new int[1001];
        f[0] = f[1] = 1;
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        scanner.close();
        for(int i = 2; i <= n; i++){
            if(i % 2 == 0){
                f[i] = f[i-1] + f[i/2];
            } else {
                f[i] = f[i-1];
            }
        }
        System.out.println(f[n]);
    }
}
发布了351 篇原创文章 · 获赞 610 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43896318/article/details/104065069
今日推荐