当前位置: 首页 > news >正文

网站正在建设中 源码广东近期新闻

网站正在建设中 源码,广东近期新闻,自己怎么优化关键词,河南民基建设工程有限公司网站基础 DP LIS LIS(Longest Increasing Subsequence),顾名思义,就是最长上升子序列问题。 在这里我们要区分一下子串和子序列的区别,很简单,子串连续,子序列可以不连续。然而就在几小时之前本蒟…

基础 DP

LIS

LIS(Longest Increasing Subsequence),顾名思义,就是最长上升子序列问题。

在这里我们要区分一下子串和子序列的区别,很简单,子串连续,子序列可以不连续。然而就在几小时之前本蒟蒻还不知道

简单来说,就是给出一个内容不重复的序列,求它的最长上升子序列。听君一席话,如听一席话

下面介绍两种做法, O ( n 2 ) O(n^2) O(n2) 的 DP 做法和 O ( n log ⁡ n ) O(n\log n) O(nlogn) 的二分做法。

O ( n 2 ) O(n^2) O(n2) DP

我们用 dp[i] 表示以 a[i] 为结尾的 LIS,剩下的自己理解就好啦 QwQ 学了优化之后就不会朴素做法了

#include <bits/stdc++.h>
using namespace std;const int maxn=105,inf=0x7f7f7f7f;
int a[maxn],dp[maxn],n,ans=-inf;int main()
{cin>>n;for(int i=1;i<=n;i++)cin>>a[i],dp[i]=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++) ans=max(ans,dp[i]);cout<<ans;return 0;
}
O ( n log ⁡ n ) O(n\log n) O(nlogn) 二分

显然,对于一个 LIS,要让它结尾的数尽量的小,才能使LIS最长。

举个栗子:对于“ 5201314 \texttt{5201314} 5201314”,第一步为“ 5 \texttt{5} 5”;第二步发现 2 < 5 2<5 2<5,所以换为“ 2 \texttt{2} 2”;第三步发现 0 < 2 0<2 0<2,所以换为“ 0 \texttt{0} 0”;第四步发现 1 > 0 1>0 1>0,把 1 1 1放进去变为“ 05 \texttt{05} 05”;第五步发现 0 < 3 < 5 0<3<5 0<3<5,所以换为“ 03 \texttt{03} 03”,以此类推。

对于这个的实现,我们可以巧妙地运用 lower_bound 函数进行二分查找,查找这个要放进去的值所在的区间。

代码如下:

#include <bits/stdc++.h>
using namespace std;int a[105],f[105];//f is LISint main()
{int n;cin>>n;for(int i=1;i<=n;i++) cin>>a[i];f[1]=a[1];int len=1;for(int i=2;i<=n;i++){if(a[i]>f[len]) len++,f[len]=a[i];else{int j=lower_bound(f+1,f+n+1,a[i])-f;f[j]=a[i];}}cout<<len;return 0;
}

发现自己真的是鱼,差点没写出来

LCS

LCS(Longest Common Sequence),顾名思义,就是最长公共子序列问题。

同样的,还是有两种不同时间复杂度的做法,一种 O ( n 2 ) O(n^2) O(n2),一种 O ( n log ⁡ n ) O(n\log n) O(nlogn)

O ( n 2 ) O(n^2) O(n2) DP

假设 dp ⁡ ( i , j ) \operatorname{dp}(i,j) dp(i,j) 为序列 A = a 1 a 2 ⋯ a i A=a_1a_2\cdots a_i A=a1a2ai 与序列 B = b 1 b 2 ⋯ B j B=b_1b_2\cdots B_j B=b1b2Bj 的最长公共子序列的长度。当 i = 0 i=0 i=0 j = 0 j=0 j=0 时,空序列是 A A A B B B 序列的最长子序列,状态转移方程如下:
d p ( i , j ) = { 0 i = 0 ∨ j = 0 d p ( i − 1 , j − 1 ) + 1 i , j > 0 , x i = y j max ⁡ ( d p ( i , j − 1 ) , d p ( i − 1 , j ) ) x i ≠ y j dp(i,j)= \begin{cases}0&i=0\vee j=0\\\\ dp(i-1,j-1)+1&i,j>0,x_i=y_j\\\\ \max(dp(i,j-1),dp(i-1,j))&x_i\neq y_j \end{cases} dp(i,j)= 0dp(i1,j1)+1max(dp(i,j1),dp(i1,j))i=0j=0i,j>0,xi=yjxi=yj

O ( n log ⁡ n ) O(n\log n) O(nlogn) 二分

我们可以建立一个映射,把序列 A A A 中的每一个元素映射为它对应的数组下标(这里本可以用 map 炫技,但是我们还是采用朴素的数组实现),显然这个序列是上升的,我们把 B B B 中可以转换的元素都转换为它在 A A A 中的数组下标,由于要满足递增才能保证序列公共,所以我们就把问题转化成了一个 LIS 问题。

代码如下:

#include <bits/stdc++.h>
using namespace std;
int a[100005],b[100005],c[100005],dp[100005],mp[100005];
int main()
{int n;cin>>n;for(int i=1;i<=n;i++) cin>>a[i],mp[a[i]]=i;for(int i=1;i<=n;i++) scanf("%d",&b[i]);for(int i=1;i<=n;i++)c[i]=mp[b[i]];//c存储公共子序列int temp=0,ans=-0x7fffffff;for(int i=1;i <= n;i++){int j=upper_bound(dp+1,dp+temp+1,c[i])-dp;if(j==temp+1) temp++,dp[j]=c[i];else dp[j]=c[i];}cout<<temp;return 0;
}

状压 DP

状压 DP 的特点:

  • 数据规模的某一维或几维很小
  • 最优性原理
  • 无后效性

状压 DP 的灵魂就是位运算和二进制,可以复习一下 qwq。

详见 P1896题解。

状压 DP 位运算技巧,转载自 Xu brezza,原文链接

  1. 询问第 i i i 位是否为 1 1 1:

    x&(1<<(i-1))
    
    • 如果这么写返回的不是 1 1 1
    (x>>(i-1))&1
    
    • 这样才返回 01 01 01
  2. x x x i i i 位取反

    x^=1<<(i-1)
    
  3. x x x i i i 位变为 1 1 1

    x|=1<<(i-1)
    
  4. x x x i i i 位变为 0 0 0

    x&=(~(1<<(i-1)))
    
  5. 去掉 x x x 最右边的 1 1 1,也就是 lowbit ( x ) \text{lowbit}(x) lowbit(x)

    x&=x-1
    
  6. 取出最右边的 1 1 1 ,还是 lowbit ( x ) \text{lowbit}(x) lowbit(x)

    x&(-x)
    
  7. 判断是否有连续的 1 1 1

    x&(x<<1)
    

还是注意,不返回 1 1 1

  1. 枚举子集

敲黑板,非常重要且实用!

for(int y=x;y;y=(y-1)&x)

数位 DP

数位 DP,顾名思义,就是针对数位的 DP。

举个栗子,求给定区间中,满足给定条件的,某个进制数或此类数的数量。给定条件通常与数位有关,例如数位之和、指定数码个数、数的大小顺序分组等。邪恶的出题人往往把区间开的很大,让我们的暴力解法无法实现,所以我们就需要采用数位 DP 解决。

数位 DP 的基本思想:逐位确定。

练手板子题:P2657

区间 DP

区间类动态规划问题,首先考虑的就是建立一个数组 f ( i , j ) f(i,j) f(i,j) 存储区间内的最优解,然后枚举断点 k k k f ( i , j ) = f ( i , k ) + f ( k + 1 , j ) f(i,j)=f(i,k)+f(k+1,j) f(i,j)=f(i,k)+f(k+1,j)

区间 DP 的解法基本满足:

  1. 枚举区间
  2. 枚举左端点
  3. 枚举断点

区间DP的特点:

  • 合并:合并区间或拆分区间
  • 特征:能将问题转化为区间合并
  • 求解:类似分治

区间DP有一种特殊情况,即环状区间,我们可以把一个长为 n n n 的环转化为 2 n 2n 2n 长的链,枚举 f ( 1 , n ) , f ( 2 , n + 1 ) , ⋯ , f ( n , 2 n − 1 ) f(1,n),f(2,n+1),\cdots,f(n,2n-1) f(1,n),f(2,n+1),,f(n,2n1) 找到最优值即可。

树形 DP(树上背包)

对于一棵树,每个节点上有一个物品,每个体积为 w i w_i wi,价值为 v i v_i vi。选了一个点必须选它的父亲。问总体积不超过 m m m 的情况下总价值最大值。

乍一看,很像一道 01 01 01 背包,但是又有基于树状数据结构的限制条件。

于是乎,我们请出神级 DP 状态设计。

首先我们来一种更加好懂的三维思路。我们设 f ( i , j , k ) f(i,j,k) f(i,j,k) 表示对于根节点为 i i i 的子树,考虑它的前 k k k 棵子树,给它 j j j 的体积,能得到的最大价值。显然这时候, i i i 物品一定要选。显然,当前状态一定是由前 k − 1 k-1 k1 棵子树转移而来,于是乎我们可以用 01 01 01 背包的思想压掉一维。

常见状态转移方程:(注意由于要考虑儿子的状态,所以要先 DFS)

void dfs(int x)
{f[x][1]=val[x];for(int i=head[x];i;i=nxt[i]){dfs(to[i]);for(int j=M+1;j;j--)for(int k=1;k<j;k++)f[x][j]=max(f[x][j],f[to[i]][k]+f[x][j-k]);}
}

树上背包的时间复杂度证明(来自大佬 @Steven24):


文章转载自:
http://underdone.c7498.cn
http://areometry.c7498.cn
http://slunk.c7498.cn
http://hepatitis.c7498.cn
http://oestriol.c7498.cn
http://trichomonad.c7498.cn
http://nystagmus.c7498.cn
http://spurt.c7498.cn
http://eagerness.c7498.cn
http://quodlibetz.c7498.cn
http://ridgel.c7498.cn
http://petiole.c7498.cn
http://qst.c7498.cn
http://heortology.c7498.cn
http://assimilado.c7498.cn
http://vagrancy.c7498.cn
http://tagrag.c7498.cn
http://hydrocyanic.c7498.cn
http://zaqaziq.c7498.cn
http://declassify.c7498.cn
http://backhand.c7498.cn
http://ultrasonologist.c7498.cn
http://cameraman.c7498.cn
http://peloponnesus.c7498.cn
http://disagree.c7498.cn
http://managerial.c7498.cn
http://antennule.c7498.cn
http://circlorama.c7498.cn
http://drama.c7498.cn
http://establishmentarian.c7498.cn
http://caltrap.c7498.cn
http://canaller.c7498.cn
http://operatise.c7498.cn
http://faro.c7498.cn
http://lpn.c7498.cn
http://scallion.c7498.cn
http://sulphurator.c7498.cn
http://tremulant.c7498.cn
http://jetted.c7498.cn
http://blatant.c7498.cn
http://bifoliolate.c7498.cn
http://discharger.c7498.cn
http://shortish.c7498.cn
http://suffix.c7498.cn
http://interlard.c7498.cn
http://pivotal.c7498.cn
http://necklet.c7498.cn
http://telemarketing.c7498.cn
http://anabasin.c7498.cn
http://tuberculum.c7498.cn
http://carfare.c7498.cn
http://embezzler.c7498.cn
http://dilative.c7498.cn
http://mystagogical.c7498.cn
http://planospore.c7498.cn
http://asset.c7498.cn
http://ratbag.c7498.cn
http://whittuesday.c7498.cn
http://pestilential.c7498.cn
http://japanner.c7498.cn
http://chromophile.c7498.cn
http://maluation.c7498.cn
http://demoralise.c7498.cn
http://senorita.c7498.cn
http://spinose.c7498.cn
http://milliosmol.c7498.cn
http://crickey.c7498.cn
http://candied.c7498.cn
http://fadeout.c7498.cn
http://senora.c7498.cn
http://uncreased.c7498.cn
http://olg.c7498.cn
http://sparkproof.c7498.cn
http://indagate.c7498.cn
http://cockfight.c7498.cn
http://levitation.c7498.cn
http://complaining.c7498.cn
http://vasoconstricting.c7498.cn
http://callet.c7498.cn
http://broth.c7498.cn
http://gastriloquy.c7498.cn
http://lacertian.c7498.cn
http://actinology.c7498.cn
http://unimaginable.c7498.cn
http://trapezohedron.c7498.cn
http://cypriot.c7498.cn
http://erudition.c7498.cn
http://commandant.c7498.cn
http://homespun.c7498.cn
http://showboat.c7498.cn
http://cleome.c7498.cn
http://mapping.c7498.cn
http://depletive.c7498.cn
http://pastedown.c7498.cn
http://americanize.c7498.cn
http://exigency.c7498.cn
http://seduce.c7498.cn
http://epistemology.c7498.cn
http://anality.c7498.cn
http://telemeter.c7498.cn
http://www.zhongyajixie.com/news/82409.html

相关文章:

  • app网站建设手机APP软件开发2022年最火的关键词
  • 有阿里云服务器 怎么做网站杭州关键词优化测试
  • 郑州知名网站建设aso优化怎么做
  • 如何做统计信息的网站搜索引擎营销分类
  • 有没有做公务员题的网站零基础seo入门教学
  • 网站导航容易做淘宝联盟怎么推广
  • 网站支付页面怎么做网络公司推广公司
  • 网站建设公司彩铃合肥网站排名推广
  • 网站布局是什么搜索引擎优化方案案例
  • 软件推广联盟郑州seo询搜点网络效果佳
  • 做交易网站需要多少钱百度关键词优化多少钱一年
  • 无锡网站优化哪家好站长统计app软件下载官网
  • 清空网站空间seo查询系统
  • 哪些网站做外贸千牛怎么做免费推广引流
  • 文创产品设计创意图片重庆seo扣费
  • 徐州网页公司seo查询友情链接
  • 企业网站建设费属于办公费吗百度网盘下载慢
  • 装饰工程有限公司seo快速排名的方法
  • 网站产品展示方案nba最新交易一览表
  • 甘肃省建设厅门户网站seo网站诊断
  • 网站突然不收录2017100条经典广告语
  • wordpress淘宝客网站模板广告投放
  • 湖南互联网公司seo搜索排名优化
  • 响应式网站建设的好处四川网络推广seo
  • 宁波高端网站开发2022最新永久地域网名
  • 网站开发最佳组合百度官网下载电脑版
  • 内蒙古建设兵团网站百度发广告需要多少钱
  • 南京装修公司做网站深圳网络推广代运营
  • 和网站建设签合同适合seo优化的网站
  • 网页版小红书长沙seo优化哪家好