拓扑排序,以及区间dp相关试题

news2024/11/15 17:16:27

目录

1.有向无环图(DAG图)

2.AOV网:顶点活动图

3.拓扑排序

4.实现拓扑排序

力扣.207课程表

牛客.最长回文子序列


1.有向无环图(DAG图)

入度:表示有多少条边指向它

出度:有多少条边向外指出他

2.AOV网:顶点活动图

3.拓扑排序

找到做事情的先后顺序

一些活动必须要在某些活动之后,比如洗脚,我们在洗脚之前可以先烧水,接凉水,等等,所以他的顺序是不唯一的,哪个在前面都可以,当完成一个动作,可以删除一个动作

4.实现拓扑排序

1.找到一个入度为0的点,然后输出

2.删除与该点连接的边

重复1和2的操作,直到图中没有点或者没有入度为0的点为止。

没有入度为0的点,就是有环(所以这也是拓扑排序的重要作用,判断图中是否有环)

借助队列,来一次BFS即可

1.初始化:把所有入度为0点点,加入到队列中

2.

(1)当队列不为空时候,拿出队头元素,加入到最终结果中

(2)删除与该元素相连的边

(3)判断与删除边连接的点,是否入度变成0,如果入度变成0,加入到队列中

力扣.207课程表

 

能否拓扑排序:是看图中是否有环

有环是false;无环就是true;

如何建图呢?

建立图的概念:灵活使用容器

1.看稠密(看数据量)

邻接表:像是一个链表

List<List<Integer>edges; 链表嵌套链表 

Map<Integer,List<Integer>>edges 

可以改成String

2.根据算法流程,灵活建图

如何找到入度 int[]in=new int[n]

 public boolean canFinish(int n, int[][] p) {
    //1.准备工作
    int[]in=new int[n];  //统计每一个顶点的入度
    //邻接表存图
    Map<Integer,List<Integer>>edges=new HashMap<>();
    for(int i=0;i<p.length;i++){
        int a=p[i][0],b=p[i][1];//b->a,先学b
        //看此时是否存在b
        if(!edges.containsKey(b)){
            edges.put(b,new ArrayList<>());
        }
        edges.get(b).add(a);//把a添加到b所连接的数组了
        in[a]++;   //a的入度+1
    }
//3.拓扑排序
 //(1)先把入度为0的点,加入到队列中
      Queue<Integer>q=new LinkedList<>();
      for(int i=0;i<n;i++){
        //判断哪一个点的入度为0
        if(in[i]==0)q.add(i);
      }
      //(2)bfs
       while(!q.isEmpty()){
        int t=q.poll();
        //找到了,把里面的返回,假如找不到则返回一个空
        for(int a:edges.getOrDefault(t,new ArrayList<>())){
        in[a]--;//等同于删除边
        if(in[a]==0) q.add(a);
        }
       }
       //4.判断是否有环
       for(int x:in){
        if(x!=0)return false;
       }
       return true;
    }

  public static PrintWriter out =new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
    public static Read in=new Read();
    public static void main(String[] args) throws IOException{
        int n = in.nextInt();
        int m = in.nextInt();
        Map<Integer, List<Integer>>edges = new HashMap<>();
        int[][]p = new int[m][2];
        int k = 0;
        while (k < m) {
            p[k][0] = in.nextInt();
            p[k][1] = in.nextInt();
            k++;
        }
        //建图,统计每一个顶点的入度
        int[]in1 = new int[n + 1];
        for (int i = 0; i < m; i++) {
            int a = p[i][0];
            int b = p[i][1]; // a->b
            if (!edges.containsKey(a)) {
                edges.put(a, new ArrayList<>());
            }
            edges.get(a).add(b);
            in1[b]++;
        }
        //拓扑排序
        Queue<Integer>q = new LinkedList<>();
        for (int i = 1; i <=n; i++) {
            if (in1[i] == 0) {
                q.add(i);
            }
        }
        int[]ret=new int[n];//统计拓扑排序结果
        int pos=0;//统计第几个
        while (!q.isEmpty()) {
            //出度,检查入度为0的点
            int t = q.poll();
            ret[pos]=t;
            pos++;           //a->b
            //它是获取开始入度为0的点,然后获取它连接的边,用l代替连接的那些点,然后进行l--,就是对应的边减少一块。他这个可以是a ,可以是别的,只是一个代号这种,他的含义是,获取入度为0的点,然后找到他的a,在a--,这样b的度就会减少
            for(int l:edges.getOrDefault(t,new ArrayList<>())){
                in1[l]--;
                if(in1[l]==0){
                    q.add(l);
                }
            }
        } 
        if(pos==n){
            //输出结果
            for(int i=0;i<n-1;i++){
                out.print(ret[i]+" ");
            }
            out.print(ret[n-1]);
        }else{
            System.out.print(-1);
        }
        out.close(); 
            }
}
//自定义输入
class Read{
   StringTokenizer st=new StringTokenizer("");
   BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
String next() throws IOException{
  while(!st.hasMoreTokens()){
      st=new StringTokenizer(bf.readLine());
  }
  return st.nextToken();
}
String nextLine() throws IOException{
    return bf.readLine();
}
int nextInt() throws IOException{
   return Integer.parseInt(next());
}

牛客.最长回文子序列

选择的方法是区间dp,动态规划

初始化:

填表顺序:

需要从下往上,从左往右填表

返回dp[0][n-1]

public int longestPalindromeSubSeq (String ss) {
//区间dp,动态规划
     char[]s=ss.toCharArray();
     int n=s.length;
     int[][]dp=new int[n][n];
     for(int i=n-1;i>=0;i--){
        dp[i][i]=1;
        for(int j=i+1;j<n;j++){
            if(i==j)dp[i][j]=1;
            else if(i<j){
                if(s[i]==s[j]){
                    dp[i][j]=dp[i+1][j-1]+2;
                }else{
                dp[i][j]=Math.max(dp[i+1][j],dp[i][j-1]);
             }
            }
        }
     }
        return dp[0][n-1];
    }
}

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

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

相关文章

React学习笔记(三)——redux状态管理工具

1. Redux快速上手 1.1 什么是Redux&#xff1f; Redux 是 React 最常用的 集中状态管理工具 &#xff0c;类似于 Vue 中的 Pinia&#xff08;Vuex&#xff09;&#xff0c; 可以独立于框架运行 作用&#xff1a; 通过集中管理的方式管理应用的状态 1.2 Redux快速体验 不和任何…

【OpenGL学习笔记】--图像管线

图像管线&#xff08;Image Pipeline&#xff09;是计算机图形学中一个核心概念&#xff0c;尤其是在图形处理和渲染的上下文中。它是一个用于处理和渲染图像的流程&#xff0c;其中包括从场景数据的输入到最终图像输出的各个阶段。 图像管线的组成 顶点处理&#xff08;Verte…

大模型入门到精通——使用Embedding API及搭建本地知识库(一)

使用Embedding API及搭建本地知识库 1. 基于智谱AI调用Embedding API实现词向量编码 首先&#xff0c;生成.env 文件&#xff0c;填写好智谱AI的API-key 参考&#xff1a;大模型入门到实战——基于智谱API key 调用大模型文本生成 读取本地/项目的环境变量。 find_dotenv(…

基于SSM的在线家教管理系统的设计与实现 (含源码+sql+视频导入教程+论文+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的在线家教管理系统拥有三个角色 管理员&#xff1a;用户管理、教师管理、简历管理、申请管理、课程管理、招聘教师管理、应聘管理、评价管理等 教师&#xff1a;课程管理、应聘…

Prometheus Operator部署管理

Prometheus Operator部署管理 Prometheus Operator & Kube-Prometheus & Helm chart 部署区别 Prometheus Operator 是 Kubernetes 原生的工具&#xff0c;它通过将 Prometheus 资源定义为 Kubernetes 对象&#xff08;CRD&#xff09;来简化 Prometheus 集群的管理。…

如何使用ssm实现公司项目管理系统设计与实现

TOC ssm136公司项目管理系统设计与实现jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规…

Avg函数求比率的应用(SQL)

题目 在 SQL 中&#xff0c;AVG 函数用于计算一组数值的平均值。这个功能也可以用来计算比率或比例。 平均值 可以用来计算比率的原因&#xff1a; 二元值&#xff1a;在许多情况下&#xff0c;我们用 1 和 0 表示发生或未发生的事件。例如&#xff0c;在你的查询中&#xff0…

基于Java的C语言课程教学实践小程序的设计与实现(论文+源码)_kaic

基于Java的C语言课程教学实践小程序的设计与实现 摘 要 在当前信息技术迅猛发展的大背景下&#xff0c;为了学生更好地利用信息技术学习C语言&#xff0c;急需开发一款C语言课程教学实践小程序。‎这个小程序可以让学生不再局限于课堂学习‎的教学模式&#xff0c;而是能够随…

freeCAD与stl文件如何互切?

大家好&#xff0c;我是山羊君Goat。 作为硬件工程师&#xff0c;如果需要给自己的硬件主板做一个DIY的造型&#xff0c;比如说B站稚晖君DIY的小电视等等。 对于这个&#xff0c;那3D打印技术就必不可少了&#xff08;怪不得说硬件学的东西都很杂 &#xff09;。 FreeCAD是一款…

BeautifulSoup4通过lxml使用Xpath定位实例

有以下html。<a>中含有图片链接&#xff08;可能有多个<a>&#xff0c;每一个都含有一张图片链接&#xff09;。最后一个<div>中含有文字。 上代码&#xff1a; import requests from bs4 import BeautifulSoup from lxml import etreeurlhttps://www.aaabb…

动态规划类型题目汇总及解析(持续更新)

目录 数字三角形模型 摘花生 最低通行费 方格取数&#xff08;洛谷&#xff09; 传纸条&#xff08;洛谷&#xff09; 最长上升子序列模型 最长上升子序列&#xff08;洛谷&#xff09;&最长递增子序列&#xff08;leetcode&#xff09; leetcode674. 最长连续递…

Image-to-Image Translation 图像翻译任务中的输入成对图像拼接成一张图技术详解

引 言 在图像翻译任务中&#xff0c;近几年比较火热的Generative Adversarial Nets (GAN)模型以及各种变体深受视觉研究团体的青睐&#xff0c;在具体任务中取得不错的实验表现。图像翻译包含两部分内容&#xff1a;一个是图像内容(image content)显示内部存在的实体,用于区分不…

【C++ Primer Plus习题】4.5

问题: 解答: #include <iostream> using namespace std;typedef struct _CandyBar {string brand;float weight;int calorie; }CandyBar;int main() {CandyBar snack { "德芙",2.1,20};cout << "品牌:" << snack.brand << endl;…

计算机毕业设计 养老院管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

IO进程day01(函数接口fopen、fclose、fgetc、fputc、fgets、fputs)

目录 函数接口 1》打开文件fopen 2》关闭文件fclose 3》文件读写操作 1> 每次读写一个字符&#xff1a;fgetc(),fputc() 针对文件读写 针对终端读写 练习&#xff1a;实现 cat 命令功能 格式&#xff1a;cat 文件名 2> 每次一个字符串的读写 fgets() 和 fputs() …

数据集笔记: FourSquare - NYC and Tokyo Check-ins

FourSquare - NYC and Tokyo Check-ins (kaggle.com) 这个数据集包含了从2012年4月12日到2013年2月16日&#xff0c;约10个月时间内在纽约市和东京收集的签到数据。数据集中包含纽约市的227,428次签到和东京的573,703次签到。每个文件包括以下8个字段&#xff1a; 用户ID&…

Shell脚本学习_运算符

目录 一、算数运算符 1、expr命令&#xff1a; 2、算数运算符介绍&#xff1a; 3、使用 ( ( ) ) 进行运算&#xff1a; 4、bc命令&#xff1a; 1.bc中互动式的数学运算&#xff1a; 2.非互动式的管道运算&#xff1a; 3.非互动式的输入重定向运算&#xff1a; 二、比较运…

Kafka的基本概念

目录 1.Kafka的介绍 1.1介绍 1.2Kafka的概念 1.3.Kafka实现的日志聚合 1.4简单的收发消息 1.5其他消费模式 1.5.1指定消费进度 1.5.2分组消费 1.5.3查看消费者组的偏移量 1.6基于Zookeeper的Kafka集群 1.6.1使用集群的原因 1.6.2Kafka集群架构 1.6.3Topic下的Part…

2024年8月25日 十二生肖 今日运势

小运播报&#xff1a;2024年8月25日&#xff0c;星期日&#xff0c;农历七月廿二 &#xff08;甲辰年壬申月辛酉日&#xff09;&#xff0c;法定节假日。 红榜生肖&#xff1a;龙、牛、蛇 需要注意&#xff1a;鸡、狗、兔 喜神方位&#xff1a;西南方 财神方位&#xff1a;…

UVM中的TLM(事务级建模)通信(2)

上一篇介绍了UVM中利用TLM进行的一对一通信&#xff1a;UVM中的TLM(事务级建模)通信(1)-CSDN博客&#xff0c;除此之外&#xff0c;UVM还有两种特殊的端口&#xff1a;analysis_port和analysis_export&#xff0c;用于完成一对多的通信。 1.analysis端口 这两种端口同样也是用于…