首页 > 其他分享 >期末集训总结

期末集训总结

时间:2024-01-13 21:25:00浏览次数:21  
标签:总结 背包 int flag 期末 DP 集训 dp dis

这个学期我们主要学了四个内容:序列DP,背包DP,区间DP,最短路。

序列DP

最长公共子序列

朴素模版
for (int i=1;i<=n;i++){
    for (int j=1;j<=m;j++){
        dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
        if (a[i]==b[j]) dp[i][j]=max(dp[i][j],dp[i-1][j-1]);
	}
}

最长上升/下降子序列

朴素模版
for (int i=1;i<=n;i++){
	for (int j=1;j<i;j++){
		if (a[j]<a[i]) dp[i]=max(dp[i],dp[j]+1);
	}
}
二分优化
for (int i=1;i<=n;i++){
    if (a[i]>dp[cnt]) dp[++cnt]=a[i];
    else{
        int l=1,r=cnt,pos=0;
        while (l<=r){
            int mid=(l+r)>>1;
            if (a[i]<=dp[mid]){
                r=mid-1;ans=mid;
            }else l=mid+1;
        }
        dp[pos]=a[i];
    }
}

背包DP

背包DP一般有两种属性,体积 \(v\) 和价值 \(w\),通常用DP或搜索求解。

01背包

顾名思义,每个物品只有选和不选两种状态,转移方程很好得:

dp[i][j]=max(dp[i-1][j],dp[i-1][j-v]+w)

可以滚动掉第一维:

dp[i]=max(dp[i],dp[j-v]+w)

滚动后要倒着枚举,否则会影响答案。

完全背包

可以选无数次物品。

dp[i][j]=max(dp[i-1][j],dp[i][j-v]+w)

多重背包

多了一个属性:数量 \(s\)

朴素做法

直接挨个枚举,时间复杂度为 \(O(W\sum_{i=1}^{n}s_i )\),无法接受。

有二进制分组优化、单调队列优化等优化方法。

区间DP

区间DP是一类以区间作为状态进行转移的动态规划,由于要对区间进行DP,所以时间复杂度通常为 \(O(n^2)\) ~ \(O(n^3)\) 左右。

在求解时,通常在区间内枚举断点,再合并断点两边的区间以获得最优解。

for (int len=2;len<=n;len++){
    for (int i=1;i<=n-len+1;i++){
        int j=i+len-1;
        for (int k=i;k<j;k++){
            dp[i][j]=min(dp[i][k]+dp[k+1][j]+cost(i,j));
        }
    }
}

最短路

图论可比DP好玩多了

存图

一般是邻接矩阵、邻接表、链式前向星三种,因为cache的机制,vector有时候会比链式前向星快

求最短路

Dijkstra

图中不能有负权边

void dijsktra(int st){
	priority_queue<PII,vector<PII>,greater<PII>> q;
	q.push({0,st});
	dis[st]=0;
	while (!heap.empty()){
		PII t=q.top();q.pop();
		int u=t.second;
		if (vis[u]) continue;
		vis[u]=true;
		for (auto p:g[u]){
			int v=p.second,w=p.first;
			if (dis[u]+w<dis[v]){
				dis[v]=dis[u]+w;
				q.push({dis[v],v});
			}
		}
	}
}
Bellman-Ford

可以用来判负环

bool bellmanford(int n,int s){
    memset(dis,0x3f,sizeof(dis));
    dis[s]=0;
    bool flag;
    for (int i=1;i<=n;i++){
        flag=0;
        for (int u=1;u<=n;u++){
            if (dis[u]==0x3f3f3f3f) continue;
            for (auto p:g[u]){
                int v=p.first, w=p.second;
                if (dis[v]>dis[u]+w){
                    dis[v]=dis[u]+w;
                    flag=1;
                }
            }
        }
        if (!flag) break;
    }
    return flag;
}

标签:总结,背包,int,flag,期末,DP,集训,dp,dis
From: https://www.cnblogs.com/code953/p/17962948

相关文章

  • 2023年度总结
    知识学习建设方面今年年初最主要的任务是将复刻了一个智能旋钮的项目,并且抽空将我去年毕业设计给升级了一下,在升级过程中更加深入学习了ESP32部分功能如:[[ESP32-两种有趣的wifi连接方式]]。后续由于工作的重心,所以后大半年都在深入理解学习嵌入式的相关知识,并且提高自己的代码质......
  • 期末集训总结
    这个学期我们主要学了四个内容:序列DP,背包DP,区间DP,最短路。序列DP最长公共子序列朴素模版for(inti=1;i<=n;i++){for(intj=1;j<=m;j++){dp[i][j]=max(dp[i-1][j],dp[i][j-1]);if(a[i]==b[j])dp[i][j]=max(dp[i][j],dp[i-1][j-1]); }}最长上升/......
  • 今日总结
    一、比赛介绍中国大学生服务外包创新创业大赛是中国高等教育学会全国普通高校学科竞赛排行榜竞赛之一,分为区域赛和全国决赛两个阶段。中国大学生服务外包创新创业大赛(以下简称“服创大赛”或“大赛”)是服务外包领域唯一的创新、创业国家级赛事。服创大赛紧贴现代服务经济和创新......
  • 1.13寒假每日总结4
    今天,主要尝试了在java中调用已有的python脚本并输出相关信息。 参考:百度文心一言的回复。 packagetest0113;importjava.io.*;publicclasstest{publicstaticvoidmain(String[]args){try{//指定Python解释器的路径......
  • SQL Join的一些总结
    SQLJoin的一些总结 1.1.1摘要Join是关系型数据库系统的重要操作之一,SQLServer中包含的常用Join:内联接、外联接和交叉联接等。如果我们想在两个或以上的表获取其中从一个表中的行与另一个表中的行匹配的数据,这时我们应该考虑使用Join,因为Join具体联接表或函数进行查询的特......
  • 每日总结2024/1/13(白盒技术)
    第一节:什么是白盒测试?白盒测试是软件测试技术,白盒测试也称结构测试或逻辑驱动测试,是针对被测单元内部是如何进行工作的测试。它根据程序的控制结构设计测试用例,主要用于软件程序验证。白盒测试中也称为透明盒测试、基于代码的测试和玻璃盒测试。它是BoxTesting软件测试方法之一......
  • .NET中的加密算法总结(自定义加密Helper类续)
    .NET中的加密算法总结(自定义加密Helper类续) 1.1.1摘要       相信许多人都使用过.NET提供的加密算法,而且在使用的过程我们必须了解每种加密算法的特点(对称或非对称,密钥长度和初始化向量等等)。我也看到过很多人写过.NET中加密算法总结,但我发现个别存在一些问题,很......
  • 索引的一些总结
    索引的一些总结 1.1.1摘要如果说要对数据库进行优化,我们主要可以通过以下五种方法,对数据库系统进行优化。1.计算机硬件调优2.应用程序调优3.数据库索引优化4.SQL语句优化5.事务处理调优在本篇博文中,我们将想大家讲述数据库中索引类型和使用场合,本文以SQLServer......
  • SQL Server 高性能写入的一些总结
    SQLServer高性能写入的一些总结 1.1.1摘要在开发过程中,我们不时会遇到系统性能瓶颈问题,而引起这一问题原因可以很多,有可能是代码不够高效、有可能是硬件或网络问题,也有可能是数据库设计的问题。本篇博文将针对一些常用的数据库性能调休方法进行介绍,而且,为了编写高效的SQ......
  • 引用CDN内容的方法总结
    引用CDN内容的方法总结 1.1.1摘要CDN相信大家都听说过,甚至使用过相关的技术,也许有些人会回答“没有听说过和使用过该技术”,真的是这样吗?CDN的全称是ContentDeliveryNetwork,即内容分发网络。其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近......