动态规划问题

news2024/11/28 6:27:27

目录

一、动态规划简介

二、利用动态规划解决问题 

1、斐波拉契序列

2、拆分词句

3、三角形最小路径和 

4、不同的路径数目(一) 

5、带权值的最小路径和 

6、求路径ii 

7、01背包 

8、不同子序列 

9、编辑距离 

10、分割回文串


一、动态规划简介

动态规划就是分治思想的延伸,通俗来讲就是大事化小,小事化了。

在将大问题划分为小问题的分治过程中,将小问题的处理结果进行保存以便后面处理大问题时使用到这些结果。

动态规划具有三个特点:

  • 将原来的问题分解成几个相似的子问题。
  • 所有的子问题只需要解决一次。
  • 存储子问题的解。

动态规划的本质:状态的定义和状态方程的定义。

动态规划问题的四个要素:

  • 状态的定义。
  • 状态间的转移方程的定义。
  • 状态的初始化。
  • 返回结果。

定义的状态之间要形成递推关系。

动态规划问题的使用场景:求最值、可不可行、是不是、求方案的个数。

二、利用动态规划解决问题 

1、斐波拉契序列

题目链接:斐波拉契数列

大家都知道斐波那契数列,现在要求输入一个正整数 n ,请你输出斐波那契数列的第 n 项。

题目分析:

  • 状态的定义:F(i) 表示斐波拉契数列的第i项。
  • 状态间的转移方程:F(i) = F(i-1)+F(i-2)。
  • 初始化:F(1) = 1,F(2) = 1。
  • 返回值:F(n)。

代码实现: 

public int Fibonacci(int n) {
        int[] fib = new int[n+1];
        fib[1] = 1;
        fib[2] = 1;
        for(int i = 3;i <= n;i++){
            fib[i] = fib[i-1] + fib[i-2];
        }
        return fib[n];
    }

 

2、拆分词句

题目链接:拆分词句

给定一个字符串s和一组单词dict,判断s是否可以用空格分割成一个单词序列,使得单词序列中所有的单词都是dict中的单词(序列可以包含一个或多个单词)。

例如:
给定s=“nowcode”;
dict=["now", "code"].
返回true,因为"nowcode"可以被分割成"now code".

题目分析:

要判断分割的单词序列是否都是dict中的单词,因为分割是从前往后进行分割,那么我们就可以给每个字符设置出一个状态true表示可以分割,如果子状态canSplit[j]为true,也就是前面一部分在dict中,那么判断后面j~i是否为dict中的元素,如果是就将canSplit[i]置为true继续向后判断,由于要判断这个s分割的单词都在dict中,所以就创建canSplit数组时需要增加一个元素canSplit[s.length()]来表示,还有一个特殊情况:如果仅仅分割s的第一个字符为dict中的元素,那么其子问题的状态怎么设定?所以就将canSplit[0]=true,表示0下标之前的状态为true,综上利用动态规划可以分析出:

  • 状态的定义 :canSplit[i]:表示该字符对应的下标是否可以拆分
  • 状态间转移方程的定义:j<i&&canSplit[i]=true&&dict.contains(subString(j,i))
  • 状态初始化:canSplit[0]=true
  • 返回结果:canSplit[字符串长度]的状态,表示整个字符串分割的单词是都在dict中。

代码实现:

public boolean wordBreak(String s, Set<String> dict) {
        if(s == null || dict == null){
            return false;
        }
        boolean[] canSplit = new boolean[s.length()+1];
        canSplit[0] = true;
        for(int i = 1;i <= s.length();i++){
            for(int j = 0;j < i;j++){
                if(canSplit[j]&&dict.contains(s.substring(j,i))){
                    canSplit[i] = true;
                }
            }
        }
        return canSplit[s.length()];
    }

3、三角形最小路径和 

题目链接:三角形最小路径和

给定一个正三角形数组,自顶到底分别有 1,2,3,4,5...,n 个元素,找出自顶向下的最小路径和。每一步只能移动到下一行的相邻节点上,相邻节点指下行种下标与之相同或下标加一的两个节点。

例如当输入[[2],[3,4],[6,5,7],[4,1,8,3]]时,对应的输出为11,

所选的路径如下图所示:

题目分析: 

要求从三角形的顶点到底部的最小路径,那么就需要求出其上层的最小路径,假设F(i,j)表示到结点的最小路径,如果该结点是最短路径上的点就直接将该点的值修改为顶点到该点的最小路径和,就不用再开辟新的空间了,又由于每一步只能移动到下一行的相邻节点上,所以结点(i,j)的最短路径F(i,j)=min(F(i-1,j)+F(i-1,j-1)),但是对于三角形两个边上的点其上层的最小路径只需加上其上层的一个点:如果j=0,F(i,j)=F(i-1,j);如果i=j,F(i,j)=F(i-1,j),于是就利用动态规划分析得出:

  • 状态的定义:F(i,j):到结点(i,j)的最小路径和(包含结点(i,j)的值)
  • 状态间转移方程的定义:F(i,j)=min(F(i-1,j)+F(i-1,j-1)),如果j=0,F(i,j)=F(i-1,j);如果i=j,F(i,j)=F(i-1,j)
  • 状态初始化:F(0,0)=val((0,0)结点的值)
  • 返回值:min(F(底部结点))

代码实现:

public int minTrace (int[][] triangle) {
        if(triangle == null){
            return 0;
        }
        int row = triangle.length;
        for(int i = 1;i < row;i++){
            for(int j = 0;j <= i;j++){
                if(j == 0){
                    triangle[i][j] += triangle[i-1][j];
                }else if( j == i){
                    triangle[i][j] += triangle[i-1][j-1];
                }else{
                    triangle[i][j] += Math.min(triangle[i-1][j-1],triangle[i-1][j]);
                }
            }
        }
        int min=triangle[row-1][0];
        for(int i = 1;i < triangle[row - 1].length;i++){
            if(triangle[row - 1][i] < min){
                min = triangle[row -1][i];
            }
        }
        return min;
    }

上述思路是从顶点到点(i,j)的最短路径,那么也可以从点(i.j)到顶点的最短路径,就从倒数第二层开始遍历,那么利用动态规划分析可得:

  • 状态的定义:F(i,j) 为底部到点(i,j)的最短路径。
  • 状态间转移方程的定义:F(i,j)=min(F(i+1,j)+F(i+1,j+1))。
  • 状态初始化:F(i,j)=triangle(i,j)。
  • 返回值:F(0,0)。

代码实现:

public int minTrace (int[][] triangle) {
       if(triangle == null){
            return 0;
        }
        int rows = triangle.length;
        for(int i = rows - 2;i >= 0;i--){
            for(int j = 0; j <= i;j++){
                triangle[i][j] += Math.min(triangle[i+1][j+1],triangle[i+1][j]);
            }
        }
        return triangle[0][0];
    }

4、不同的路径数目(一) 

题目链接:不同的路径数目(一)

一个机器人在m×n大小的地图的左上角(起点)。

机器人每次可以向下或向右移动。机器人要到达地图的右下角(终点)。

可以有多少种不同的路径从起点走到终点?

备注:m和n小于等于100,并保证计算结果在int范围内

题目分析: 

由于机器人每次可以向下或向右移动,对于到达第一行和第一列的点只有一种路径,经过分析到达其他点的路径方案为左边点的路径方案数和上边点的路径方案数之和。所以利用动态规划分析如下:

  • 状态的定义:F(i,j)表示起点到点(i,j)的路径方案数。
  • 状态间的转移方程:F(i,j) = F(i-1,j) + F(i,j-1)。
  • 状态初始化:F(i,1)=1,F(i,j)=1,到达第一行和第一列的点只有一种路径。
  • 返回值:F(m,n)。

代码实现:

public int uniquePaths (int m, int n) {
    int[][] path = new int[m+1][n+1];
       for(int i = 1; i <= n;i++){
           path[1][i] = 1;
       }
        for(int i = 1; i <= m;i++){
            path[i][1] = 1;
        }
        for(int i = 2; i <= m;i++){
            for(int j = 2;j <= n;j++){
                path[i][j] = path[i][j-1] + path[i-1][j];
            }
        }
         return path[m][n];
    }

5、带权值的最小路径和 

题目链接:带权值的最小路径和

给定一个由非负整数填充的m x n的二维数组,现在要从二维数组的左上角走到右下角,请找出路径上的所有数字之和最小的路径。
注意:你每次只能向下或向右移动。

题目分析:

利用动态规划分析如下:

  • 状态的定义:F(i,j)表示起点到坐标为(i,j)的最小路径和。
  • 状态间的转移方程:F(i,j) = min(F(i-1,j), F(i,j-1))。
  • 状态初始化:F(i,0) +=F(i-1,0);F(0,j) +=F(0,j-1)第一行和第一列元素进行初始化。
  • 返回值:F(m-1,n-1)。

代码实现:

public int minPathSum (int[][] grid) {
      int rows = grid.length;
      int cols = grid[0].length;
      for(int i = 1; i < rows;i++){
          grid[i][0] += grid[i-1][0];
      }
      for(int i = 1; i < cols;i++){
            grid[0][i] += grid[0][i-1];
      }
      for(int i = 1; i < rows;i++){
          for(int j =1;j < cols;j++){
              grid[i][j] += Math.min(grid[i-1][j],grid[i][j-1]);
          }
      }
      return grid[rows-1][cols-1];
    }

6、求路径ii 

题目链接:求路径ii

给定一个m*n的地图,其中加入了一些障碍。每次只能向下或者向右走,问从左上角走到右下角有多少不同的路径?

分别用0和1代表空区域和障碍

例如

下图表示有一个障碍在3*3的图中央。

[
    [0,0,0],
    [0,1,0],
    [0,0,0]
]

有2条不同的路径

备注:m和n不超过100.

题目分析:

由动态规划思想分析可得:

  • 状态的定义:F(i,j)表示起点到点(i,j)的路径方案数。
  • 状态间的转移方程:如果obstacleGrid(i,j)=1,F(i,j)=0,否则F(i,j)=F(i-1,j)(j=0),F(i,j)=F(i,j-1)(i=0),F(i,j) = F(i-1,j) + F(i,j-1)(i!=0,j!=0)。
  • 状态初始化:F(0,0)=obstacleGrid(0,0)==1?0:1。
  • 返回值:F(m-1,n-1)。

代码实现:

public static int uniquePathsWithObstacles (int[][] obstacleGrid) {
        if(obstacleGrid==null)
            return 0;
        int i,j;
        int m=obstacleGrid.length;
        int n=obstacleGrid[0].length;
        int[][]f=new int[m][n];
        if(obstacleGrid[0][0]==1){
            return 0;
        }
        else{
            f[0][0]=1;
        }
        for(i=0;i<m;i++){
            for(j=0;j<n;j++){
                if(obstacleGrid[i][j]==1){
                    f[i][j]=0;
                    continue;
                }
                if(i==0&&j!=0){
                    f[i][j]=f[i][j-1];
                }
                if(i!=0&&j==0){
                    f[i][j]=f[i-1][j];
                }
                if(i!=0&&j!=0){
                    f[i][j]=f[i-1][j]+f[i][j-1];
                }
            }
        }
        return f[m-1][n-1];
    }

7、01背包 

题目链接:01背包

已知一个背包最多能容纳体积之和为v的物品,现有 n 个物品,第 i 个物品的体积为 vi , 重量为 wi,求当前背包最多能装多大重量的物品?

题目分析:

  • 状态的定义:F(i,j)表示i个物品和体积为j的重量。
  • 状态间的转换方程: 如果空间不足,F(i,j) = F(i-1,j).如果空间充足就要判断是否放入元素取max( F(i-1,j),(F(i-1,j-vi)+wi))。
  • 初始化:第0行和第0列的元素为0,表示未放任何物品和体积为0的情况。
  • 返回值:F(m,n)。

代码实现:

    /**
     * 计算01背包问题的结果
     * @param V int整型 背包的体积
     * @param n int整型 物品的个数
     * @param vw int整型二维数组 第一维度为n,第二维度为2的二维数组,vw[i][0],vw[i][1]分别描述i+1个物品的vi,wi
     * @return int整型
     */
public static int knapsack (int V, int n, int[][] vw) {
        int[][] maxValue = new int[n+1][V+1];
        for(int i = 1; i <= n;i++){
            for(int j = 1; j <= V;j++){
                if(j < vw[i-1][0]){
                    maxValue[i][j] = maxValue[i-1][j];
                }else{
                    maxValue[i][j] = Math.max(maxValue[i-1][j],maxValue[i-1][j-vw[i-1][0]]+vw[i-1][1]);
                }
            }
        }
        return maxValue[n][V];
}

8、不同子序列 

题目链接:不同的子序列

给定两个字符串S和T,返回S子序列等于T的不同子序列个数有多少个?

字符串的子序列是由原来的字符串删除一些字符(也可以不删除)在不改变相对位置的情况下的剩余字符(例如,"ACE"is a subsequence of"ABCDE"但是"AEC"不是)
例如:

S="nowcccoder", T = "nowccoder"

返回3

题目分析:

  • 状态的定义:dp[i][j]表示以i-1结尾的字符串S等于以j-1结尾的字符串T子序列的个数。
  • 状态间的转移方程:dp[i][j]=(S[i-1]==T[j-1])?(dp[i-1][j-1]+dp[i-1][j]):dp[i-1][j].
  • 初始化:dp[0][j] = 0,表示S字符串为空,dp[i][0] = 1,表示T字符串为空,dp[0][0]=1表示S和T都为空。
  • 返回值:dp[S.length()][T.length()]。

代码实现:

 public int numDistinct (String S, String T) {
        int lenS = S.length();
        int lenT = T.length();
        int[][] dp = new int[lenS+1][lenT+1];
        for(int i = 0;i <= lenS;i++){
            dp[i][0] = 1;
        }
        for(int i = 1;i <= lenS;i++){
            for(int j = 1;j <= lenT;j++){
                if(S.charAt(i-1) == T.charAt(j-1)){
                    dp[i][j] = dp[i-1][j-1] + dp[i-1][j];
                }else{
                    dp[i][j] = dp[i-1][j];
                }
            }
        }
        return dp[lenS][lenT];
    }

9、编辑距离 

题目链接:编辑距离

给定两个单词word1和word2,请计算将word1转换为word2至少需要多少步操作。
你可以对一个单词执行以下3种操作:
a)在单词中插入一个字符
b)删除单词中的一个字符
c)替换单词中的一个字符

题目分析:

  • 状态的定义:dp[i][j]表示前i-1的word1转换为前j-1的word2需要多少步操作。
  • 状态间的转换方程:dp[i][j]=(word1[i-1]==word2[j-1])?dp[i-1][j-1]:(min(dp[i-1][j]+1, dp[i][j-1]+1,dp[i-1][j-1]+1),dp[i-1][j]+1表示删除word1的第i-1个字符,dp[i][j-1]+1表示新增word1的第i-1个字符,dp[i-1][j-1]+1表示替换word1的第i-1个字符。
  • 初始化:dp[0][0] = 0,dp[0][j] = j,dp[i][0] = i。
  • 返回值:p[word1.length()][word2.length()]。

代码实现:

public int minDistance (String word1, String word2) {
        int len1 = word1.length();
        int len2 = word2.length();
        int[][] dp = new int[len1+1][len2+1];
        for(int i = 1;i <= len1;i++){
            dp[i][0] = i;
        }
        for(int j = 1;j <= len2;j++){
            dp[0][j] = j;
        }
        for(int i = 1;i <= len1;i++){
            for(int j = 1;j <= len2;j++){
                if(word1.charAt(i-1) == word2.charAt(j-1)){
                    dp[i][j] = dp[i-1][j-1];
                }else{
                    int min1 = Math.min(dp[i-1][j-1],dp[i-1][j]);
                    int min2 = Math.min(dp[i][j-1],dp[i-1][j]);
                    dp[i][j] = Math.min(min1,min2) + 1;
                }
            }
        }
        return dp[len1][len2];
    }

10、分割回文串

题目链接:分割回文串

给出一个字符串s,分割s使得分割出的每一个子串都是回文串

计算将字符串s分割成回文分割结果的最小切割数

例如:给定字符串s="aab",

返回1,因为回文分割结果["aa","b"]是切割一次生成的。

题目分析:

  • 状态的定义:dp[i]表示到第i个字符分割的次数。
  • 状态间的转移方程:dp[i] = min(dp[i],dp[j]+1)。
  • 初始化:dp[i]表示到第i个字符的最大分割次数。
  • 返回值:dp[s.length()]。
public boolean isPalindrome(String s){
        int begin = 0;
        int end = s.length()-1;
        while(begin < end){
            if(s.charAt(begin) == s.charAt(end)){
                begin++;
                end--;
            }else{
                return false;
            }
        }
        return true;
    }
    public int minCut (String s) {
       int len = s.length();
       int[] dp = new int[len+1];
       for(int i = 0;i <= len;i++){
          dp[i] = i-1;
       }
       for(int i = 1;i <= len;i++){
           for(int j = 0;j<i;j++){
               if(isPalindrome(s.substring(j,i))){
                   dp[i] = Math.min(dp[i],dp[j]+1);
               }
           }
       }
       return dp[len];
    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Go 语言中的 Slice 陷阱:如何避免常见错误

Go 语言中的 Slice 陷阱&#xff1a;如何避免常见错误前言slice 作为函数 / 方法的参数进行传递的陷阱slice 通过 make 函数初始化&#xff0c;后续操作不当所造成的陷阱性能陷阱小结耐心和持久胜过激烈和狂热。 哈喽大家好&#xff0c;我是陈明勇&#xff0c;本文介绍的内容是…

Lesson 7.1 无监督学习算法与 K-Means 快速聚类

文章目录一、聚类算法与无监督学习二、K-Means 快速聚类的算法原理1. K-Means 快速聚类的基本执行流程2. K-Means 快速聚类的背后的数学意义三、K-Means 快速聚类的 sklearn 实现方法1. sklearn 中实现 K-Means 快速快速聚类2. 轮廓系数基本概念与 sklearn 中实现方法从现在开始…

【基于jeeSite框架】SpringBoot+poi+Layui自定义列表导出

文章目录功能效果思路代码前台后台easyPoi,easyExcel&#xff0c;poi三者的区别poipoi依赖导出ExcelHSSF方式导出XSSF方式导出SXSSF方式导出导入excelHSSF方式导入XSSF方式导入SXSSF方式导入easyPoi依赖包采用注解导出导入easyExcel依赖采用注解导出导入API文档easyPoi操作文档…

内网渗透(二十五)之Windows协议认证和密码抓取-使用Hashcat和在线工具破解NTLM Hash

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

说说Knife4j

Knife4j是一款基于Swagger2的在线API文档框架使用Knife4j, 需要 添加Knife4j的依赖当前建议使用的Knife4j版本, 只适用于Spring Boot2.6以下版本, 不含Spring Boot2.6 在主配置文件(application.yml)中开启Knife4j的增强模式必须在主配置文件中进行配置, 不要配置在个性化配置文…

Java 代理模式详解

1、代理模式 代理模式是一种比较好理解的设计模式。简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问&#xff0c;这样就可以在不修改原目标对象的前提下&#xff0c;提供额外的功能操作&#xff0c;扩展目标对象的功能。 代理模式的主要作用是扩展目标对象…

C++——运算符重载

1、运算符重载的概念 运算符重载&#xff0c;就是对已有的运算符重新进行定义&#xff0c;赋予其另一种功能&#xff0c;以适应不同的数据类型。运算符重载的目的是让语法更加简洁运算符重载不能改变本来寓意&#xff0c;不能改变基础类型寓意运算符重载的本质是另一种函数调用…

【半监督医学图像分割 2021 TMI】SimCVD 论文翻译

文章目录【半监督医学图像分割 2021 TMI】SimCVD 论文翻译摘要1. 介绍2. 相关工作3. 方法3.1 总览3.2 任务制定3.3 基础体系结构3.4 边缘对比蒸馏4. 实验4.1 数据集和预处理4.2 实现细节5. 结论5.1 实验&#xff1a;LA5.2 实验&#xff1a;Pancreas6. 消融研究6.1 边界感知对比…

嵌入式ARM工业边缘计算机BL302的CAN总线接口如何设置?

CAN 接口如图所示&#xff0c;输入如下命令&#xff1a; ifconfig -a //查看所有网卡 如果 FlexCAN 驱动工作正常的话就会看到 CAN 对应的网卡接口&#xff0c;如图。从图中可 以看出&#xff0c;有一个名为“can0”的网卡&#xff0c;这个就是 BL302 板上的 CAN1 接口对应的 c…

借助亚马逊云科技,Early Data完成数据云上安家、实现降本增效

数字经济时代&#xff0c;伴随着大数据应用的不断深入&#xff0c;企业对用户及市场发展动向的判断正变得愈加精准。数据资产不再是虚无缥缈的东西&#xff0c;而是可以帮助企业切切实实找到业务增长点&#xff0c;洞悉潜在商机&#xff0c;拥有巨大潜力的“宝藏”。IDC数据显示…

【 mybatis的工作流程】

目录一.mybatis执行流程二.使用工具类简化项目&#xff08;反射的体现&#xff09;2.1 Sqlsession工厂对像2.2 工具类&#xff08;可直接放在工具类使用&#xff09;一.mybatis执行流程 1.1 读取主配置文件mybatis-config.xml&#xff0c;获得运行环境和数据库连接。 1.2 加载映…

对象之间的关系

目录1. 依赖2. 关联3. 聚合4. 组合Java的对象/类之间有四种关系&#xff1a;依赖、关联、组合、聚合。 1. 依赖 依赖&#xff08;Dependency&#xff09;&#xff1a; 一个对象的功能依赖于另一个对象。 类比&#xff1a;人类生存依赖食物和空气 体现&#xff1a;被依赖者体…

Ethercat系列(5)TWcat3激活过程的协议分析(续1)

顺序写系统时间偏移从-》主顺序写时间延迟主-》从从-》主顺序写分布式时钟启动主-》从从-》主读多重写系统时间主-》从从-》主顺序写应用层控制主-》从从-》主顺序读错误计数器主-》从从-》主顺序读应用层状态主-》从从-》主顺序读应用层&#xff0c;广播写错误计数器主-》从从…

2023 年首轮土地销售活动来了 与 The Sandbox 一起体验「体素狂热」!

2 月 14 日晚上 11 点&#xff0c;开始你的体素冒险。 The Sandbox 很高兴推出 2023 年的第一次土地销售活动。欢迎来到「体素狂热 (Voxel Madness)」&#xff01; 简要概括 土地销售抽奖活动将于北京时间 2 月 14 日星期二晚上 11 点开始 「体素狂热」 土地销售活动将于 2 月…

企业公众号菜单添加视频的完整教程(组图)

公众号实用教程&#xff0c;公众号运营教程。 有公众号的朋友&#xff0c;看过来&#xff0c;今天来教教大家&#xff0c;在企业微信公众号中如何调用视频列表。先上一个效果吧&#xff1a; 最终效果的截图 -关注酷播公众号&#xff0c;查看实际的应用效果&#xff08;在本公众…

【shell 编程大全】脚本交互 以及表达式

脚本交互 以及表达式 1. 概述 嗨&#xff0c;我又来继续分享了。今天分享的内容是脚本交互&#xff0c;再开始接下来的分享开始之前&#xff0c;让我们来回顾下上一次(【shell 编程大全】内容格式化以及多样化输出)的内容&#xff1a; 内容格式化 重定向管道符后台执行信息符号…

C语言学习_DAY_3_基本数据类型_运算符与表达式【C语言学习笔记】

目录 I. 基本数据类型 II. 复杂的输出和输入语句编写 III. 运算符与表达式 III.I 算术运算符 III.II 关系运算符 III.III 逻辑运算符 III.IV 位运算符 III.V 三目运算符 III.VI 逗号运算符 高质量博主&#xff0c;点个关注不迷路&#x1f338;&#x1f338;&#x1f3…

电脑怎么备份文件?含泪分享3种免费的方法

电脑里面保存着我们很多文件数据&#xff0c;比如工作文档、珍贵的照片、喜欢的音乐或者视频等。你很可能会遇到下面的原因而丢失数据&#xff1a;清空回收站&#xff0c;或者使用永久删除文件的方法&#xff1b;电脑出现故障&#xff0c;比如硬盘故障、系统崩溃&#xff1b;病…

Python实现基于openCV+百度智能云平台实现《1:N人脸考勤机》文章最后附带源码!

目录 一、 项目介绍 1.1 项目名称 1.2 项目简介 1.3 项目物料 1.4 技术栈 二、 项目架构 三、项目细节 3.1 环境搭建 3.2 利用opencv实现摄像头调取及相关图像的采集 3.3 利用aips上传图像和结果返回 3.4 结果优化和处理 3.5 可扩展性 3.6 遗留问题和…

中睿天下获评2022年度中关村网信联盟工业互联网标准工作特别贡献奖

近日&#xff0c;中关村网络安全与信息化产业联盟&#xff08;简称“CCAIA”&#xff09;于线上召开联盟第二届第五次会员大会&#xff0c;来自全国的联盟成员代表、行业专家等100余人出席会议&#xff0c;共同听取了联盟2022年工作总结与2023年工作计划&#xff0c;大会设置了…