经典DP

1.背包问题

(1)01背包

从n个重量和价值分别为wi,vi的物品,从中选出不超过W的物品,每种物品仅有一件,求所有方案中V的最大值。

最朴素最简单也最费时的方法:O(2^n) int rec(int i,int j)//从第i个开始挑选总重小于j的部分

递归  递归终止条件:i==n  return 0;

      递归分支:① j<wi res=rec(i+1,j);  //无法挑选,看下一个

                ② res=max(rec(i+1,j),rec(i+1,j-w[i])+v[i]))//挑选,不挑选,选其中大的

分析:递归搜索深度→n,每层两次分支(选与不选),有重复计算

优化:记录每次递归的结果(记忆化搜索)

 

Int dp[MAX_N][MAX_N];

递归 int rec(int i,int j)

    初始条件:memset(dp,-1,sizeof(dp));

终止条件:①dp[i][j]>=0 returndp[i][j]//已计算过

②i==n return 0;

    递归分支:① j<wi res=rec(i+1,j);  //无法挑选,看下一个

                ② res=max(rec(i+1,j),rec(i+1,j-w[i])+v[i]))//挑选,不挑选,选其中大的

分析及remark:复杂度O(nW)

   数组初始化:①memset(type *arrary,figure,sizeof(arrary))

                      只能填充(0,+-1,0x3f3f3f3f),其他值不可以 

                      memset按照1字节为单位对内存填充,-1的二进制每一位均为1

                      ②fill(type* arrary,type *arrary+n,figure) 可赋值任意值

    递归  

 ↓↓↓↓↓↓                  for(int i=n-1;i>=0;i--) //

递推(双重循环)           for(int j=0;j<=w;j++)

                          { if(j<w[i]) dp[i][j]=dp[i+1][j]; //不选

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

其他3种递推写法:(来源:《挑战程序设计竞赛》)

 

(2)完全背包

递推关系1:(3重循环,有重复计算)复杂度O(nW^2)

For(int i=0;i<n;i++)

 For(int j=0;j<=w;j++)

  For(int k=0;k*w[i]<=j;k++)

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

优化:(左上→右下  变为 左→右)

Dp数组初始化为0

For(int i=0;i<n;i++)

 For(int j=0;j<=w;j++)

{

 If(j<w[i]) dp[i+1][j]=dp[i][j];

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

}           只有这里与01背包不同,前j个已更新过,可直接用

 

进一步优化:用一个数组实现,只需要记录当前最优状态

比较01背包与完全背包(循环方向不同)

 

2.LCS(Longest common subsequence)

 

dp[n][m]即为所求

for(int i=0;i<n;i++)

  for(int j=0;j<m;j++)

{

  if(s[i]==t[i])

   dp[i+1][j+1]=dp[i][j]+1;

else

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

}

 

3.LIS(Longest Increasing subsequence)

 

dp[i]:以ai为结尾的最长上升子序列长度

dp[i]=max{1,dp[i]+1|j<i且aj<ai}

O(n^2)

int res;

for(int i=0;i<n;i++)

 {

  dp[i]=1;

for(int j=0;j<i;j++)

  if(a[j]<a[i])              //每存在aj<ai&&j<i,dp[i]更新一次

   dp[i]=max{dp[i],dp[j]+1};

}

res=max{dp[i]|0<=i<n}

Remark:

其他方法:

可以用lower_bound();

   dp[i]:长度为i+1的上升子列中末尾元素的最小值(不存在的话为inf)

dp[max_n]初始化为inf,按顺序逐个考虑数列的元素,对于每个ai,如果i=0||dp[i-1]<ai,就用dp[i]=min(dp[i],ai)更新,最终找出使得dp[i]<inf的最大的i+1即为结果。DP直接实现,可以在O(n^2)的时间内给出结果,但可以进一步优化,dp数组中除inf之外是单调递增的,对于每个ai最多有一次更新,更新的位置可用二分的方法优化,时间复杂度可以降低到O(nlogn)

int dp[max_n]

void solve()

{

  fill(dp,dp+n,inf);

  for(int i=0;i<n;i++)

    *lower_bound(dp,dp+n,a[i])=a[i];

  res=lower_bound(dp,dp+n,inf)-dp;

}

// lower_bound()可以从已排好序的a中利用二分搜索找出满足ai>=k的ai的最小的指针,类似的还有upper_bound,找出的为ai>k的最小指针

//求n个有序数组a中k的个数,可以用:upper_bound(a,a+n,k)-lower_bound(a,a+n,k);

转载于:https://www.cnblogs.com/Egoist-/p/7391224.html

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

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

相关文章

C语言、嵌入式重点知识:回调函数

前言 上文分享了一个专用的双链表的基本操作示例&#xff1a;双链表的操作示例&#xff08;附代码&#xff09;这里提到了一个关键词&#xff1a;专用。与专用对应的词是通用。我们从字面上可以很容易理解这两个词&#xff0c;专用就是针对特定情况的&#xff0c;特点就是很有局…

python神经网络预测结果每次不一样_神经网络预测

神经网络预测时间:2019-12-09 12:34:00 作者&#xff1a;路由君 来源&#xff1a;路由器之家路由器之家网今天精心准备的是《神经网络预测》&#xff0c;下面是详解&#xff01;bp神经网络预测是不是数据越多&#xff0c;预测能力就越好&#xff1f;不仅是神经网络&#xff0c;…

js数组的拷贝赋值复制二三事总结

今天在看React-native性能优化的时候&#xff0c;看到如何避免shouldComponentUpdate的异常数据时&#xff0c;脑内一阵风暴&#xff0c;从而牵连出一连串的问题&#xff0c;于是有了这一篇关于js数组的复制&#xff08;深浅拷贝&#xff09;与赋值等为何能产生异常数据的文章。…

今天我勇敢的点就一个gpio口

现在已经三月份了&#xff0c;时间过得超快&#xff0c;早上起来打开电脑&#xff0c;有点不习惯&#xff0c;微信群唧唧歪歪的那些股神今天不知为什么安静了。我喜欢看大家热闹的样子&#xff0c;更喜欢热闹的时候给我们发几个红包。我记得2015年&#xff0c;股市非常好&#…

Linux 通用gpio口驱动,rockchip

dts文件 gpio_rs485: gpio_rs485 {status = "okay";compatible = "gpio,px30-gpio";cname = "rs485";en-gpio = <&gpio3 12 GPIO_ACTIVE_HIGH>;}

android自定义控件

---恢复内容开始--- 1.新建一个类&#xff0c;继承View父类。重写一个或多个构造器后&#xff0c;在图编辑器里就有该控件可以拖动添加了。 2.若想使用Draw来绘制自己的控件。可以在View&#xff08;&#xff09;方法中使用Draw&#xff08;&#xff09;来绘制。 3.还可以定义控…

python语言中strike_Python学习笔记

嵌套函数作用域def make_adder(augend):def add(addend):return augend addendreturn add内部的函数可以访问外部函数scope内的变量&#xff0c;但是不能够重新对其赋值。如果重新赋值那么会在内部函数的scope内创建一个同名的本地变量(Python不允许对non-local变量赋值)。yie…

数据结构(4)

文章目录栈与队列栈队列![在这里插入图片描述](https://img-blog.csdnimg.cn/20200301182116946.png?x-oss-processimage/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzY2Mzc4MA,size_16,color_FFFFFF,t_70)栈与队列 栈 ha…

写一个公用的gpio口驱动

因为项目需要控制的GPIO口比较多&#xff0c;如果每个GPIO口都写一个驱动就显得比骄麻烦&#xff0c;所以就写了一个通用的GPIO口驱动。只要dts里面配置好设备GPIO相关信息就可以自动加载了。可以很充分的体现多个设备一个驱动的优良性。dts文件gpio_rs485: gpio_rs485 {status…

数据结构(5)

文章目录各种算法选择排序插入排序希尔排序***快速排序***归并排序二分查找各种算法 def bubble_sort(alist):"""冒泡排序"""n len(alist)for j in range(n-1):count 0for i in range(0, n-1-j):# 班长从头走到尾if alist[i] > alist[i1]:a…

大神们都应该去哪里工作?

接上一篇文章。文中提到我认识了一个做嵌入式的大神&#xff0c;技术真的非常厉害。我们在调试过程中&#xff0c;遇到问题&#xff0c;他总是能告诉我们排查的手段&#xff0c;而且针对一个问题&#xff0c;他能想到几种不同的解决方案。嵌入式驱动跟其他软件有点不一样&#…

堆喷射

堆喷射主要用于绕过ASLR。下面演示堆喷射分析与效果。 1.代码 void heap_spray(){   char chunk[LEN] { 0 };   memset(chunk, 0x90, LEN - 10);   strcat(chunk, "shellcode");   for (int i 0;i < 100;i)   {     void *p malloc(LEN);    …

大华管理平台用户名_智能财务引领商业与管理变革——浙大EMBA首席财务官研习社走进大华股份...

杭商传媒记者 周 珂/文 徐青青/摄编辑 何影丹当前经济环境和市场需求瞬息万变&#xff0c;企业竞争日益激烈&#xff0c;盈利持续下降&#xff0c;产品、服务同质化严重&#xff0c;这不仅对业务部门提出了挑战&#xff0c;也对传统的财务管理产生了巨大的冲击。财务不能高…

【深度】韦东山:一文看尽 linux对中断处理的前世今生

作者&#xff1a;韦东山前言&#xff1a;本文&#xff0c;4200字&#xff0c;研究代码花了一天&#xff0c;写出来花了一天&#xff1b;录视频估计又得花半天&#xff1b;真怀念以前简单粗暴的生活啊&#xff1a;拿起话筒就录视频&#xff0c;先画好图&#xff1f;那是不需要的…

数据结构(6)二叉树

文章目录二叉树二叉树三种遍历二叉树知中及先或后序&#xff0c;求二叉树二叉树 class Node(object):""""""def __init__(self, item):self.elem itemself.lchild Noneself.rchild Noneclass Tree(object):"""二叉树"&qu…

鼠标中间无法打开新标签_还记得鼠标有几个键?Win10环境鼠标中键的妙用

大家经常使用鼠标&#xff0c;但有多少人还能意识到&#xff0c;其实鼠标是有三个键的&#xff1f;除了常用的左键右键&#xff0c;鼠标中间的滚轮也可以按下去&#xff0c;然而鼠标的这个中键&#xff0c;却日常坐冷板凳&#xff0c;几乎被人所遗忘。其实&#xff0c;鼠标中键…

vue技术栈

1 vue 说明:vue生命周期&#xff1a;技术点&#xff1a;1&#xff1a;常用的API:computed&#xff0c;methods&#xff0c;props&#xff0c;mounted&#xff0c;created&#xff0c;components 2vue-cli说明:vue绞手架&#xff0c;用于快速搭建项目&#xff0c;并管理项目技术…

python中pillow库怎么使用_Python 图像库Pillow使用

需求是将一张含有透明度的图片和一张正常图片进行常规合并&#xff0c;并在图片上添加文字&#xff0c;代码如下&#xff1a;from PIL import Imageimport cv2base_image Image.open(图片的绝对路径) # 有透明度的图片target Image.new(RGB, base_image.size, (0, 0, 0, 0)) …

找不到问题的核心,你永远解决不了问题。

上学那会儿&#xff0c;我是个数学常拿60分的人&#xff08;满分150分&#xff09;&#xff0c;我却喜欢做几何题。根据已知的条件&#xff0c;推导出所需的其他条件&#xff0c;所有需要的条件得出后&#xff0c;再根据正确的公式算出所求的值。这个不断求解的过程其实挺有意思…

.net MVC路由

首先&#xff0c;在MVC应用程序的入口函数Application_Start()中(在事件在GLOBAL文件中)&#xff0c;通过RouteConfig.RegisterRoutes(RouteTable.Routes)注册路由集合信息。RouteTable.Routes是一个公开的路由集对象&#xff0c;用于保存路由信息集合信息&#xff0c;类型问Ro…