首页 > 其他分享 >万能破题方法包(1)动态规划法

万能破题方法包(1)动态规划法

时间:2024-06-15 19:59:56浏览次数:10  
标签:状态 方程 破题 int 万能 规划法 问题 阶段

一、前言

    动态规划法是一种用于解决多阶段决策问题的优化方法

1.1、概念

       在动态规划法中,问题被分解为多个阶段,并且每个阶段都有多个可能的选择。动态规划法通过保存中间计算结果,以减少重复计算,从而提高算法的效率。  

1.2、解决步骤

  1. 定义问题的状态:将问题划分为多个阶段,并定义每个阶段的状态。状态通常是用变量来表示的。

  2. 定义状态转移方程:根据问题的状态,定义状态转移方程,即每个阶段之间的转移方式。状态转移方程描述了从一个阶段到下一个阶段的关系。

  3. 初始化状态:确定初始状态,即第一个阶段的状态。

  4. 使用状态转移方程进行迭代计算:根据状态转移方程,使用递推或迭代的方法计算每个阶段的状态。

  5. 根据最终状态获取问题的最优解:通过迭代计算得到最终状态后,根据需要,从最终状态中获取问题的最优解。

二、方法分析 

       在动态规划法中,重点是定义好问题的状态和状态转移方程。状态可以是问题的某种属性或信息,而状态转移方程则是描述问题状态之间关系的数学公式。通过正确定义状态和状态转移方程,可以将问题的求解过程化简为多个阶段的计算,从而提高求解效率。

三、应用范围 

       动态规划法广泛应用于解决各种优化问题,如最优路径问题、背包问题、序列问题等。它能够在很短的时间内求解一些在暴力求解方法下需要指数时间的问题,因此被广泛应用于算法设计和优化领域。

四、应用编码

### 例子:斐波那契数列

斐波那契数列定义如下:
- F(0) = 0
- F(1) = 1
- F(n) = F(n-1) + F(n-2)  (n >= 2)

### 动态规划实现

C# 

#include <stdio.h>

// 计算斐波那契数列的第n项
int fibonacci(int n) {
    if (n <= 1) {
        return n;
    }

    // 定义一个数组来保存斐波那契数列的值
    int fib[n + 1];
    
    // 初始状态
    fib[0] = 0;
    fib[1] = 1;
    
    // 利用转移方程计算斐波那契数列
    for (int i = 2; i <= n; i++) {
        fib[i] = fib[i - 1] + fib[i - 2];
    }
    
    return fib[n];
}

int main() {
    int n;
    printf("请输入一个整数 n: ");
    scanf("%d", &n);

    int result = fibonacci(n);
    printf("斐波那契数列的第 %d 项是: %d\n", n, result);

    return 0;
}

Python 

# 计算斐波那契数列的第n项
def fibonacci(n):
    if n <= 1:
        return n
    
    # 定义一个数组来保存斐波那契数列的值
    fib = [0] * (n + 1)
    
    # 初始状态
    fib[0] = 0
    fib[1] = 1
    
    # 利用转移方程计算斐波那契数列
    for i in range(2, n + 1):
        fib[i] = fib[i - 1] + fib[i - 2]
    
    return fib[n]

# 测试
n = int(input("请输入一个整数 n: "))
result = fibonacci(n)
print(f"斐波那契数列的第 {n} 项是: {result}")

### 例子:0/1背包问题

给定一组物品,每个物品有一个重量和一个价值,以及一个背包,它具有最大承载重量。我们希望在不超过背包承载重量的前提下,使得装入背包的物品总价值最大。

#### 问题描述:
- 给定物品重量数组 `weights` 和价值数组 `values`,以及背包的最大承载重量 `W`。
- 求解最大价值。

### 动态规划实现

Java

public class Knapsack {
    public static int knapsack(int[] weights, int[] values, int W) {
        int n = weights.length;
        // 定义DP数组
        int[][] dp = new int[n + 1][W + 1];

        // 初始化DP数组
        for (int i = 0; i <= n; i++) {
            for (int w = 0; w <= W; w++) {
                if (i == 0 || w == 0) {
                    dp[i][w] = 0;
                } else if (weights[i - 1] <= w) {
                    dp[i][w] = Math.max(values[i - 1] + dp[i - 1][w - weights[i - 1]], dp[i - 1][w]);
                } else {
                    dp[i][w] = dp[i - 1][w];
                }
            }
        }

        return dp[n][W];
    }

    public static void main(String[] args) {
        int[] weights = {1, 2, 3, 4};
        int[] values = {10, 20, 30, 40};
        int W = 5;

        int result = knapsack(weights, values, W);
        System.out.println("背包中可以装入的最大价值是: " + result);
    }
}

五、方法评价

       动态规划法的时间复杂度通常是由问题的阶段数和每个阶段的选择数决定的。

       具体的时间复杂度取决于问题的特性。

  结语 

方法不对,努力白费

方法用对,事半功倍

努力的同时一定要注重方法的高效性

!!! 

标签:状态,方程,破题,int,万能,规划法,问题,阶段
From: https://blog.csdn.net/m0_73399576/article/details/139683839

相关文章

  • 万能破题方法包(2)递归法
    一、前言   递归法是一种通过调用自身来解决问题的方法1.1、概念    在递归法中,将问题分解为更小的子问题,并通过递归调用解决这些子问题,最终将所有子问题的解合并起来得到原问题的解。1.2、解决步骤 定义递归函数:首先需要定义一个递归函数,这个函数用......
  • 使用动态规划法求最大连续子序列和
    通过动态规划方法求最大连续子序列和问题描述:给定一个有n(n>=1)个整数的序列,求出其中最大连续子序列的和。如:{-2,11,-4,13,-5,-2},最大的连续子序列是:{11,-4,13}和为20。【规定】一个序列的最大连续子序列和至少是0,如果小于0,其结果为0。解法:使用一个整型数组arr[]来存......
  • macOS下使用bits/stdc++.h万能头文件
     macOS下使用bits/stdc++.h万能头文件1.终端中输入echo|g++-v-xc++-E-#include<...>searchstartshere:/usr/local/include/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/Library/Developer/CommandLineTools/usr/lib/clang/12.......
  • 多段图最短路径(动态规划法)
    目录前言一、多段图的分析二、算法思路三、代码如下:总结前言问题描述:设图G=(V,E)是一个带权有向图,如果把顶点集合V划分成k个互不相交的子集Vi(2≤k≤n,1≤i≤k),使得对于E中的任何一条边(u,v),必有u∈Vi,v∈Vi+m(1≤i≤k,1<i+m≤k),则称图G为多段图,称s∈V1为源点,t∈......
  • 7.2k star的万能视频解析下载插件
    今天给大家介绍一个超级厉害的浏览器插件,可以解析各个平台网页视频——猫抓。项目简介猫抓(cat-catch)是一款资源嗅探扩展插件,他能够帮助你筛选列出当前页面的资源。简单来说,当你打开任意一个带有视频的网页,猫抓就可以解析视频的真实地址,协助你下载视频。猫抓这个名字很有......
  • 完全免费又超级好用的万能视频播放器PotPlayer安装教程分享
    PotPlayer拥有异常强大的内置音视频解码器,可以支持几乎全部音乐、视频文件格式的播放。PotPlayer内置了非常全面且兼容性良好的视频音频解码器,因此用户无需进行任何手动配置,即可以直接播放几乎目前网络上所有主流的视频音频格式文件,非常方便。而且它的界面也非常简洁清爽,它的配置......
  • 基于ADB Shell 实现的 Android TV、电视盒子万能遥控器 — ADB Remote ATV
    ADBRemoteATVAndroidTV的遥控器,基于ADBShell命令ADBRemoteATV是一个AndroidTV的遥控器,基于ADBShell命令,泛用性更高。下面的shell命令,是软件的基本原理,通过shell命令可模拟物理遥控器的基本按键,此外还可以快捷启动指定APP、借助手机软键盘输入中/英字符等。......
  • 小爱音箱万能遥控器版
    Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解`小爱音箱万能遥控器版日期:2019-11-20阿珏谈天说地浏览:1808次评论:14条又又又又又双双叒叕是个小米,这次要开箱的是一个小米音箱万能遥控......
  • 老板看过来:防火墙不是万能的,数据安全你得这么管
    在信息技术不断进步的今天,企业的数据安全管理愈加重要。很多企业的老板可能会认为,只要有了防火墙,公司的数据就能安全无忧。然而,防火墙虽然是重要的第一道防线,但它并不是万能的。数据安全管理是一个全面的系统工程,需要从多个角度出发,才能真正保护企业的数据资产。以下是一些关键的......
  • copier:万能的对象拷贝偷懒神器
    copier:万能的对象拷贝偷懒神器原创 golang学习记 golang学习记 2024-04-0710:29 四川 听全文如果你干什么事都专注一点那么你就会超过80%的人如果你在一个点上坚持5年那么你进入10%都有可能 我见过的最美的一天是你穿过人群找到我的那一天 g......