动态规划——斐波那契问题(Java)

目录

什么是动态规划?

练习

练习1:斐波那契数

练习2:三步问题

练习3:使用最小花费爬楼梯

练习4:解码方法


什么是动态规划?

动态规划(Dynamic Programming,DP):是一种常见的算法设计技巧,通常用于解决具有重叠子问题和最优子结构的问题。在动态规划中,将原问题分解成若干子问题,通过求解子问题的最优解来得到原问题的最优解。

如何用动态规划解决问题?

我们可以通过一下5步来解决动态规划问题

1. 确定状态表示

什么是状态表示? 

状态表示:指在解决问题时所需要考虑和记录的关键信息。这些状态可以是问题的某种属性或特征,通过对这些状态的定义和记录,可以更好地理解问题的结构,从而设计出高效的动态规划算法。

在解决动态规划问题时,我们通常需要创建动态规划数组(dp),用于存储子问题的解,动态规划数组一般是一个 一维 或 二维 数组,而状态表示,可以理解为 dp表中值的含义 (即dp[i] 或 dp[i][j]的含义)

如何确定状态表示?

1. 从题目要求中确定

2. 根据题目要求 以及 经验 确定

3. 在分析问题的过程中,发现重复子问题,从而确定状态表示

在使用动态规划解决问题时,我们常见的状态表示有两种:

dp[i]:表示以i位置为结尾,...

dp[i]:表示以i位置为起始,...

2. 确定状态转移方程

什么是状态转移方程? 

状态转移方程:确定状态之间的转移关系,即如何从一个状态推导出另一个状态。这是动态规划问题的核心,也是最难的一步,也就是需要确定 dp[i] 或 dp[i][j] = ?

如何确定状态转移方程?

 需要根据题目要求以及状态表示进行推导

3. 进行初始化

初始化:初始化动态规划数组或表格,通常需要设置起始状态的初始值,为后续的状态转移做准备。(例如:保证后续填表过程中不会发生越界)

4. 确定填表顺序

5. 确定返回值

接下来,我们通过动态规划来解决斐波那契相关练习,帮助我们进一步理解动态规划

练习

练习1:斐波那契数

题目链接:

LCR 126. 斐波那契数 - 力扣(LeetCode)

题目描述:

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1

给定 n ,请计算 F(n) 。

答案需要取模 1e9+7(1000000007) ,如计算初始结果为:1000000008,请返回 1。

示例 1:

输入:n = 2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1

示例 2:

输入:n = 3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2

示例 3:

输入:n = 4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3

提示:

  • 0 <= n <= 100

思路分析:

首先,我们来确定状态表示 ,即dp[i] 表示什么

这道题根据题目要求就可直接定义出状态表示:dp[i]:第i个斐波那契数

确定了状态表示后,我们来推导状态转移方程,即dp[i] = ?

题目中其实已经告诉了我们状态转移方程,即 F(n) = F(n - 1) + F(n - 2)

因此,状态转移方程为:

dp[i] = dp[i-1] + dp[i - 2]

接下来,我们对dp数组进行初始化:

从递推公式我们就可以看出:在i = 0 和 i = 1时是没办法进行推导的,因为dp[-2] 和 dp[-1] 不存在

因此,我们在进行填表之前,要先将 0,1位置的值进行初始化,题目中已经告诉我们dp[0] = 0,dp[1] = 1

填表顺序:从左到右依次填写 

返回值:要求出第n个斐波那契数,因此,返回值为dp[n] 

注意:题目要求答案需要取模 1e9+7(1000000007) ,不要忽略了这个条件

代码实现:

class Solution {
    public int fib(int n) {
        //处理特殊情况
        if(n == 0) return 0;
        //创建dp表
        int[] dp = new int[n+1];
        //初始化
        dp[0] = 0;
        dp[1] = 1;
        //填表
        for(int i = 2; i <= n; i++){
            dp[i] = (dp[i-1] + dp[i-2]) % 1000000007;
        }
        //返回结果
        return dp[n];
    }
}

优化:

在这道题中,我们可以使用滚动数组进行优化:

由于我们每次确定dp[i]时,只会涉及到三个变量:dp[i-2] dp[i-1] dp[i],因此,每次求dp[i] 时只需要知道dp[i-1] 和 dp[i-2]的值就可以了,我们可以使用变量 a  b c来分别表示 dp[i-2] dp[i-1] dp[i], c = a + b,这样我们仅需使用三个变量就可以遍历数组

在每次求出c的值后,更新a和b的值(注意先更新a的值(a = b),再更新b的值(b = c)) 使其向后移动,从而确定下一个结果

优化代码:

class Solution {
    public int fib(int n) {
        //处理特殊情况
        if(n == 0) return 0;
        //优化
        int a = 0, b = 1, c = 1;
        for(int i = 2; i <= n; i++){
            c = (a + b) % 1000000007;
            //更新a和b
            a = b;
            b = c;
        }
        //返回结果
        return c;
    }
}

练习2:三步问题

题目链接:

面试题 08.01. 三步问题 - 力扣(LeetCode)

题目描述:

三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。

示例1:

 输入:n = 3 
 输出:4
 说明: 有四种走法

示例2:

 输入:n = 5
 输出:13

提示:

  1. n范围在[1, 1000000]之间

思路分析:

 小孩每次可以上1阶、2阶或3阶台阶,我们首先来模拟小孩上台阶的过程:

状态表示:

我们以 i 位置为结尾进行分析:

那么在这道题中,以i位置为结尾,则可表示为小孩到达第i阶台阶,

而dp[i]则可表示:小孩到达第i阶台阶时,一共有dp[i]种上楼方式

状态转移方程:

由于小孩一次可以上1阶、2阶或3阶台阶,因此,小孩可以从 第 i-3 或 i-2 或 i-1位置到达第i阶台阶

由于dp[i]: 小孩到达第i阶台阶时,一共有dp[i]种上楼方式,因此,

dp[i-1]: 小孩到达第 i - 1阶台阶时,一共有dp[i - 1]种上楼方式,则从i-1位置到达i位置有dp[i-1]种上楼方式

同理,从i-2位置到达i位置有dp[i-2]种上楼方式,从i-3位置到达i位置有dp[i-3]种上楼方式

因此,dp[i] = dp[i-1] + dp[i-2] + dp[i-3]

初始化:

由于dp[i] = dp[i-1] + dp[i-2] + dp[i-3],因此,在i = 0, i = 1 以及 i = 2时是没办法进行推导的,

因此我们需要在填表之前,对0,1,2位置的值进行初始化,

由于至少上一阶台阶,因此,我们选择从1位置开始初始化,根据分析:dp[1] = 1, dp[2] = 2, dp[3] = 4

填表顺序:

i位置的值是由 i-1、i-2和 i-3位置的值得到的,因此填表顺序为从左向右

返回值:

要求上到第n阶台阶的方式,因此我们返回dp[n]

注意:由于本题计算的结果可能很多,需要对结果进行取模,在计算时,将三个值先加起来再进行取模((dp[i-1] + dp[i-2]+ dp[i-3]) % 1000000007)是不可取的(会报错),因此我们每计算一次(每两个数相加),就进行一次取模

代码实现:

class Solution {
    public int waysToStep(int n) {
        //处理特殊情况
        if(n == 1 || n == 2) return n;
        //创建dp表
        int[] dp = new int[n+1];
        //初始化
        dp[1] = 1;
        dp[2] = 2;
        dp[3] = 4;
        //填表
        for(int i = 4; i <= n; i++){
            dp[i] = ((dp[i-1] + dp[i-2]) % 1000000007 + dp[i-3]) % 1000000007;
        }
        //返回
        return dp[n];
    }
}

与练习1相同,由于dp[i] = dp[i-1] + dp[i-2] + dp[i-3],因此,本题也可以使用滚动数组进行优化:

class Solution {
    public int waysToStep(int n) {
        //处理特殊情况
        if(n == 1 || n == 2) return n;
        if(n == 3) return 4;
        //创建dp表
        //初始化
        int a = 1, b = 2, c = 4, d = 0;
        //填表
        for(int i = 4; i <= n; i++){
            d = ((a + b) % 1000000007 + c) % 1000000007;
            a = b;
            b = c;
            c = d;
        }
        //返回
        return d;
    }
}

练习3:使用最小花费爬楼梯

题目链接:

746. 使用最小花费爬楼梯 - 力扣(LeetCode)

题目描述:

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。

示例 1:

输入:cost = [10,15,20]
输出:15
解释:你将从下标为 1 的台阶开始。
- 支付 15 ,向上爬两个台阶,到达楼梯顶部。
总花费为 15 。

示例 2:

输入:cost = [1,100,1,1,1,100,1,1,100,1]
输出:6
解释:你将从下标为 0 的台阶开始。
- 支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。
- 支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。
- 支付 1 ,向上爬一个台阶,到达楼梯顶部。
总花费为 6 。

提示:

  • 2 <= cost.length <= 1000
  • 0 <= cost[i] <= 999

思路分析:

 可以从0或者1位置开始爬楼梯,当爬到i位置时,需要支付cost[i]继续向上爬楼梯,可以爬到 i + 1 或 i + 2位置,最终求爬到顶楼的最小花费(注意:顶楼在 cost.length 位置,而不是 cost.length - 1位置

状态表示:

我们以 i 位置为结尾进行分析:

那么在这道题中,以i位置为结尾,则可表示到达第i阶台阶,

而dp[i]则可表示:到达第i阶台阶时的最小花费

状态转移方程:

由于一次只能向上爬一个或两个台阶,因此,只能从i - 2位置 或 i - 1位置到达i位置

由于dp[i]: 到达第i阶台阶时的最小花费,因此,

dp[i-1]: 到达第 i - 1阶台阶时,最小花费为dp[i-1],则从i-1位置到达i位置的最小花费为 dp[i-1] + cost[i-1]

同理,从i-2位置到达i位置时最小花费为dp[i-2],则从 i-2 位置到达i位置的最小花费为 dp[i-2] + cost[i-2]

要求到达第i阶台阶时的最小花费,则dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])

初始化:

可以从0位置或1位置开始向上爬,因此dp[0] = dp[1] = 0

填表顺序:由于dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]),填表顺序为从左向右

返回值:要求到达顶楼(cost.length)的最小花费,因此返回dp[cost.length]

代码实现:

class Solution {
    public int minCostClimbingStairs(int[] cost) {
       int n = cost.length;
       //创建dp表
       int[] dp = new int[n + 1];
       //填表
       for(int i = 2; i <= n; i++){
            dp[i] = Math.min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]);
       }
       //返回
       return dp[n];
    }
}

练习4:解码方法

题目链接:

91. 解码方法 - 力扣(LeetCode)

题目描述:

一条包含字母 A-Z 的消息通过以下映射进行了 编码 :

'A' -> "1"
'B' -> "2"
...
'Z' -> "26"

要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,"11106" 可以映射为:

  • "AAJF" ,将消息分组为 (1 1 10 6)
  • "KJF" ,将消息分组为 (11 10 6)

注意,消息不能分组为  (1 11 06) ,因为 "06" 不能映射为 "F" ,这是由于 "6" 和 "06" 在映射中并不等价。

给你一个只含数字的 非空 字符串 s ,请计算并返回 解码 方法的 总数 。

题目数据保证答案肯定是一个 32 位 的整数。

示例 1:

输入:s = "12"
输出:2
解释:它可以解码为 "AB"(1 2)或者 "L"(12)。

示例 2:

输入:s = "226"
输出:3
解释:它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。

示例 3:

输入:s = "06"
输出:0
解释:"06" 无法映射到 "F" ,因为存在前导零("6" 和 "06" 并不等价)。

提示:

  • 1 <= s.length <= 100
  • s 只包含数字,并且可能包含前导零。

思路分析:

对给定的数字字符串进行解码,1-26分别对应A-Z,且在解码时不能出现前导0(如05)

状态表示:

我们以 i 位置为结尾进行分析:

那么在这道题中,以i位置为结尾,则dp[i]则可表示:0 到 i 位置一共有dp[i]种解码方法

状态转移方程:

由于1 - 26 分别对应 A - Z,则一个字母只可能由一个字符或两个字符进行解码得到,因此,以i位置为结尾进行解码时,最后一个字母只可能由当前字母(s[i])或当前字母和前一个字母(s[i] 和 是[i-1])进行解码得到

由于dp[i]: 0 到 i 位置一共有dp[i]种解码方法,因此,

dp[i-1]: 0 到 i 位置一共有dp[i]种解码方法,若s[i]能够解码,则以i位置为结尾的字符串共有 dp[i-1]种解码方法,若s[i]不能解码,则解码方法为0

同理,dp[i-2]表示以 i - 2为结尾的字符串一共有dp[i-2]种解码方法,若s[i]和s[i-1]位置组成的数字能够解码,则以i位置为结尾的字符串共有 dp[i-2]种解码方法,否之,则解码方法为0

因此,

若s[i]解码成功(s[i] >= '1' && s[i] <= '9'),则dp[i] += dp[i-1],否之,dp[i] += 0

若s[i]和s[i-1]位置组成的数字解码成功,则 dp[i] += dp[i-2],否之,dp[i] += 0

在判断s[i]和s[i-1]位置组成的数字是否解码成功时,我们可以先将其转换为数字 n = (s[i-1] - '0') * 10 + (s[i] - '0'),由于不能出现前导0,因此,若结果在 10 - 26区间内,则解码成功,反之,则失败

初始化:

由于在确定i位置的值时需要 i - 1 和 i - 2位置上的值,因此,我们要先初始化i = 0和 i = 1位置上的值:

dp[0]:若 s[0] >= '1' && s[0] <= '9',则dp[0] = 1,反之,dp[0] = 1

dp[1]:s[1] >= '1' && s[1] <= '9',dp[1] += dp[0],反之,dp[1] += 0

s[0] 和 s[1]结合后数字在[10, 26]区间内,则dp[1] += 1,反之,dp[1] += 0

我们可以发现:前两个位置的初始化方式与填写后续i位置时十分相似,都需要判断字符是否能够

正确解码,因此,我们可以在最前面添加一个辅助节点,来帮助我们进行初始化:

在本题中,添加辅助节点后,就只需要初始化dp[1],若 s[1] >= '1' && s[1] <= '9',则dp[1] += dp[0]

在添加辅助节点时需要注意:

1. 辅助节点里的值要保证后续填表过程中不出错

2. 下标的映射关系

添加辅助节点后dp表与s的映射关系变为了 dp[i] - s[i-1],因此,我们在编写代码时要注意

当s[0]解码正确时,dp[1] += dp[0],因此,dp[0]应初始化为 1

填表顺序:从左往右

返回值:dp[n]

代码实现:

class Solution {
    public int numDecodings(String ss) {
        char[] s = ss.toCharArray();
        int n = s.length;
       //创建dp表
       int[] dp = new int[n+1];
       //初始化
       dp[0] = 1;//保证后续填表正确
       if(s[0] > '0' && s[0] <= '9') dp[1] += dp[0];
       //填表
       for(int i = 2; i <= n; i++){
            int num = s[i-1] - '0';//注意下标的映射关系
            if(num > 0 && num <= 9) dp[i] += dp[i-1];
            num = (s[i-2] - '0') * 10 + s[i-1] - '0';
            if(num >= 10 && num <= 26) dp[i] += dp[i-2];
       }
       //返回
       return dp[n];
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/482391.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于VS项目无法找到源文件或者,代码更改项目却不更改的问题

Studio\workShop\......\obj\Debug\net6.0\GraduationProjectEX.Shared.AssemblyInfo.cs”。 像上面这个&#xff0c;说无法找到源文件&#xff0c;然后我去目录找&#xff0c;果然是没有的&#xff0c;我的是依赖方面的错误&#xff0c;莫名其妙&#xff0c;因为我更改了项目…

超快的 AI 实时语音转文字,比 OpenAI 的 Whisper 快4倍 -- 开源项目 Faster Whisper

faster-whisper 这个项目是基于 OpenAI whisper 的模型&#xff0c;在上面的一个重写。 使用的是 CTranslate2 的这样的一个库&#xff0c;CTranslate2 是用于 Transformer 模型的一个快速推理引擎。 在相同精度的情况下&#xff0c;faster-whisper 的速度比 OpenAI whisper …

鸿蒙Harmony应用开发—ArkTS-if/else:条件渲染

ArkTS提供了渲染控制的能力。条件渲染可根据应用的不同状态&#xff0c;使用if、else和else if渲染对应状态下的UI内容。 说明&#xff1a; 从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使用。 使用规则 支持if、else和else if语句。 if、else if后跟随的条件语句…

心脏滴血漏洞详解(CVE-2014-0160)

参考链接&#xff1a;心脏滴血漏洞利用&#xff08;CVE-2014-0160&#xff09;_cve-2014-0160漏洞禁用443端口-CSDN博客 目录 OpenSSL简介 漏洞原理 影响版本 漏洞复现 漏洞利用 修复方案 OpenSSL简介 OpenSSL是一个开放源代码的软件库包&#xff0c;提供了一组加密和认…

【leetcode热题】 位1的个数

编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 1 的个数&#xff08;也被称为汉明重量&#xff09;。 提示&#xff1a; 请注意&#xff0c;在某些语言&#xff08;如 Java&#xff09;中…

【算法】回溯与深搜

方法论 1.构建决策树 2.设计代码&#xff1a;全局变量、dfs函数 3.剪枝&#xff0c;回溯 全排列 给定一个不含重复数字的整数数组 nums &#xff0c;返回其 所有可能的全排列 。可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff…

探索超融合服务器:是否助力企业飞跃数字化挑战?

在数字化不断深化的今天&#xff0c;企业面临着前所未有的转型压力和机遇。IT基础设施作为支撑企业运营的重要基石&#xff0c;其性能、效率及可管理性都直接关系到企业的竞争力。超融合服务器作为一种创新的IT架构&#xff0c;被许多业内专家视为应对现代业务挑战的有效手段。…

移动硬盘变NTFS无法访问:原因分析与数据恢复全攻略

一、遭遇困境&#xff1a;移动硬盘变NTFS打不开 在日常的数据存储与传输中&#xff0c;移动硬盘无疑是我们的得力助手。然而&#xff0c;当移动硬盘突然显示NTFS格式且无法打开时&#xff0c;这无疑给我们带来了巨大的困扰。面对这种突发情况&#xff0c;许多用户会感到焦虑和…

⾃定义类型:结构体

目录 1. 结构体类型的声明 1.1 结构体回顾 1.1.1 结构的声明 1.1.2 结构体变量的创建和初始化 1.2 结构的特殊声明 1.3 结构的⾃引⽤ 2. 结构体内存对⻬ 2.1 对⻬规则 2.2 为什么存在内存对⻬? 2.3 修改默认对⻬数 3. 结构体传参 4. 结构体实现位段 4.1 什么是位段…

二进制王国(蓝桥杯备赛)【sort/cmp的灵活应用】

二进制王国 题目链接 https://www.lanqiao.cn/problems/17035/learning/?contest_id177 题目描述 思路 这里就要灵活理解字典序排列&#xff0c;虽然string内置可以直接比较字符串字典序&#xff0c;但是在拼接时比较特殊&#xff0c;比如 11的字典序小于110&#xff0c;但…

故障诊断模型 | 基于图卷积网络的轴承故障诊断

文章目录 文章概述模型描述模型描述参考资料文章概述 故障诊断模型 | 基于图卷积网络的轴承故障诊断 模型描述 针对基于图卷积网络(GCN)的故障诊断方法大多默认节点间的权重相同、导致诊断精度较低与鲁棒性较差的问题,提出了一种基于欧式距离和余弦距离的 GCN 故障诊断方法…

HCIP实验02

实验步骤 1、R1和R2使用ppp链路之连&#xff0c;R2和R3把2条ppp链路捆绑为ppp直连 [R2]int Mp-group 0/0/0 [R2]int Serial 3/0/1 [R2-Serial3/0/1]ppp mp Mp-group 0/0/0 [R2-Serial3/0/1]int Serial 4/0/0 [R2-Serial4/0/0]ppp mp Mp-group 0/0/0 [R3]int Mp-group 0/0/…

代码随想录算法训练营 DAY 17 | 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和

110.平衡二叉树 平衡二叉树的定义&#xff1a;任何节点的左右子树高度差绝对值不超过1 空树也是AVL! 确定遍历顺序&#xff1a; 求高度用后序&#xff0c;求深度用前序。&#xff08;取决于需不需要从下往上返回结果&#xff09; 先判断它是不是平衡二叉树 如果是就返回 如…

MT2191 整数大小比较(高精度)

给出两个正整数&#xff0c;判断他们的大小。 输入格式&#xff1a; 两个正整数。 输出格式&#xff1a; 若前者大&#xff0c;输出>&#xff1b; 若后者大&#xff0c;输出<&#xff1b; 若一样大&#xff0c;输出。 输入&#xff1a; 1412894619244619891 23762842…

G1垃圾回收器深入探索——卡表、记忆集和SATB算法

G1垃圾回收器&#xff0c;我们常常会提到里面的分区和垃圾回收算法&#xff0c;这次我们撇开表层&#xff0c;仔细看看里面的三个核心组成部分及其原理。 Card Table&#xff08;卡表&#xff09; 在进行YoungGC时&#xff0c;我们会判断一个对象是否被引用&#xff0c;但这个过…

软考复习笔记day3(计算机体系结构和指令系统基础)(精简版)

计算机体系结构分类 处理机数量分类&#xff1a; 单处理&#xff08;一个处理单元&#xff09;并行处理系统&#xff08;两个以上处理机互联&#xff09;.分布式处理系统 Flynn分类&#xff1a;&#xff08;常考&#xff09; 以指令流和数据流进行区别 指令流由控制部分进…

Keepalive与idle监测及性能优化

Keepalive 与 idle监测 Keepalive&#xff08;保活&#xff09;: Keepalive 是一种机制&#xff0c;通常用于TCP/IP网络。它的目的是确保连接双方都知道对方仍然存在并且连接是活动的。这是通过定期发送控制消息&#xff08;称为keepalive消息&#xff09;实现的。如果在预定时…

使用aop做权限控制

1、pom.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http:/…

甘当“银行引流中介”?飞猪旅行的“猪小金”产品暗藏玄机

在今年“315”晚会上&#xff0c;央视曝光了同程金融以赊销礼包、回购礼品卡的套路变相开展高息“现金贷”等业务乱象。目前&#xff0c;同程金融已对相关产品进行下线&#xff0c;同时对该公司所有产品进行合规性检查。 而这种在监管灰色地带试探的戏码&#xff0c;也出现阿里…

离散数学之范式方法

引子&#xff1a; 对于一个命题&#xff0c;如何判定命题公式为永真式、永假式和可满足的呢或二个命题公式等价。我们学过二种方法&#xff1a; 1&#xff0c;真值表法&#xff1a;对于变元的所有真值指 派&#xff0c;看对应命题公式的真值。2&#xff0c;命题演算方法&#…