蓝桥杯每日一题(背包dp,线性dp)

//3382 整数拆分

将 1,2,4,8看成一个一个的物品,以完全背包的形式放入。

一维形式:f]0]=1;

#include<bits/stdc++.h>
using namespace std;
//3382整数拆分
const int N=1e6+10, M=5e5+10;
int mod=1e9;
int f[N],n;
int main()
{
    cin>>n;
    //转化为完全背包问题,
    //状态是找前i个二进制数,组成j的数量
    f[0]=1;
    for(int i=1;i<=n;i*=2)//
        //和完全背包一样遍历所有物品(以前i件物品)
    {
        for(int j=i;j<=n;j++)
        {
            f[j]=(f[j]+f[j-i])%mod;
        }
    }
    cout<<f[n]<<endl;
}

由于二维形式会爆。下面给出写法

需要注意的一点是:由于每次只用到前一层循环的数据,当前层j放不下i的位置,也就是j<i的位置,也要更新,因为下一层可能用到这个数据,不更新的话,就都是0了。

#include<bits/stdc++.h>
using namespace std;

const int N=1e3+10, M=5e2+10;
int mod=1e9;
int f[N][N], n;

int main()
{
    cin >> n;
    for(int i=0; i<=n; i++)
    {
        f[i][0] = 1;
    }
    int t;
    for(int i=1; i<=n; i*=2)
    {
        t=i;
        for(int j=1; j<=n; j++)
        {
            f[i][j] = f[i/2][j];
            if(j >= i)
            {
                f[i][j] = (f[i][j] + f[i][j-i]) % mod;
            }

        }
    }
    cout << f[t][n] << endl;
}

  2 01 背包问题

注意存w和v的的值是从1开始。因为还要考虑状态i-1 

#include<bits/stdc++.h>
using namespace std;
// 2 01 背包问题
const int N=1010;
int w[N],v[N];
int f[N][N];//前N件物品,背包容量
int main()
{
    int n,V;
    cin>>n>>V;
    for(int i=1;i<=n;i++)
    {
        cin>>v[i]>>w[i];
    }
    //for(int i=0;i<=V;i++)f[0][i]=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<=V;j++)
        {
            f[i][j]=f[i-1][j];
            if(j>=v[i])f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]);
        }
    }
    cout<<f[n][V]<<endl;

}

8完全背包问题

#include<bits/stdc++.h>
using namespace std;
// 8 完全背包问题
const int N=1010;
int f[N][N];
int n,m;
int w[N],v[N];
int main()
{
  cin>>n>>m;
  for(int i=1;i<=n;i++)
  {
      cin>>v[i]>>w[i];
  }
  for(int i=1;i<=n;i++)
  {
      for(int j=0;j<=m;j++)
      {
          f[i][j]=f[i-1][j];
          if(j>=v[i])f[i][j]=max(f[i][j],f[i][j-v[i]]+w[i]);
      }
  }
  cout<<f[n][m]<<endl;
}

9分组背包问题

完全背包问题是k的个数作为循环。分组背包是组内的所有物品作为循环;

#include<bits/stdc++.h>
using namespace std;
//9 分组背包问题
const int N=110;
int f[N][N];
int n,m;
int w[N][N],v[N][N],s[N];
int main()
{
  cin>>n>>m;
  for(int i=1;i<=n;i++)
  {
      int t;
      cin>>t;
      s[i]=t;
      for(int j=1;j<=t;j++)
      {
          cin>>v[i][j]>>w[i][j];
      }
  }
  for(int i=1;i<=n;i++)
  {
      for(int j=0;j<=m;j++)
      {
          f[i][j]=f[i-1][j];
          for(int k=1;k<=s[i];k++)
          {
              if(v[i][k]<=j)
              {
                f[i][j]=max(f[i][j],f[i-1][j-v[i][k]]+w[i][k]);
              }
          }
      }
  }
  cout<<f[n][m]<<endl;
}

//6 多重背包问题III

多重背包比完全背包多了个数的限制条件

没有用优化:SF错误


#include<bits/stdc++.h>
using namespace std;
//6 多重背包问题 III
const int N=3010;
int f[N];
int n,m;
int w[N],v[N],s[N];
int main()
{
  cin>>n>>m;
  for(int i=1;i<=n;i++)
  {
      cin>>v[i]>>w[i]>>s[i];
  }
  for(int i=1;i<=n;i++)
  {
      for(int j=0;j<=m;j++)
      {
          for(int k=0;k <= s[i] && k*v[i] <= j;k++)
          {
                f[j]=max(f[j],f[j-v[i]*k]+w[i]*k);
          }
      }
  }
  cout<<f[m]<<endl;
}

//1051最大的和

f数组保存从1到i,连续的子串的最大值。

rf数组保存从i到n的~

在计算f的时候,要时刻记住求的是前i个数中连续的一个最大的子串

然后用df思想思考,要么选a[i]要么不选,选ai的时候要保证前面是连续的。

因而用s这个临时变量,保存必选ai的时候的最大值。‘


#include<bits/stdc++.h>
using namespace std;
//1051最大的和
const int N=50010;
int f[N],rf[N],a[N];
int main()
{
    int t,n;
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(int i=1; i<=n; i++)cin>>a[i];

//避免出现全都是负数,但是结果为全0
        memset(f,-0x3f,sizeof f);
        memset(rf,-0x3f,sizeof rf);
//找从1到n 以i结尾的连续串的最大的和是多少
        int s=0;//截止到i这个位置,而且必须加上a[i]的最大值
        for(int i=1; i<=n; i++)
        {
            //用闫氏dp的思考方式思考
            //i这个点的f值,要么加上a[i],要么不加。
            //s就保存了加上ai的结果,s永远保存在运行到i的时候的位置的最大值(包含a[i])
            s=max(s,0)+a[i];//要保证是一个和a[i]连续的数
            f[i]=max(s,f[i-1]);
        }
        s=0;
        for(int i=n; i>=1; i--)
        {
           s=max(0,s)+a[i];
           rf[i]=max(s,rf[i+1]);
        }
        int res=-0x3f3f3f3f;
        for(int i=1;i<=n;i++)
        {
            res=max(res,rf[i+1]+f[i]);
        }
        cout<<res<<endl;
    }

}

898、数字三角形

第一个自己做出来的线性dp,注意为了防止出现全零的情况,一定要初始化为-0x3f3f3f3f

在找上一个状态的时候,注意下标不要错。

#include<bits/stdc++.h>
using namespace std;
//898 数字三角形
const int N=510;
int f[N][N];
int a[N][N];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=i;j++)
        {
            cin>>a[i][j];
        }
    }
    for(int i=0;i<=n;i++)
    {
        for(int j=0;j<=i;j++)
        {
            f[i][j]=-0x3f3f3f3f;
        }
    }
    f[1][1]=a[1][1];
    for(int i=2;i<=n;i++)
    {
        for(int j=1;j<=i;j++)
        {
            if(j==1)
            {
                f[i][j]=f[i-1][1]+a[i][j];
            }
            else if(j==i)
            {
                f[i][j]=f[i-1][i-1]+a[i][j];
            }
            else
            {
                f[i][j]=max(f[i-1][j-1]+a[i][j],f[i-1][j]+a[i][j]);
            }
        }

    }
    int res=-0x3f3f3f3f;
        for(int i=1;i<=n;i++)
        {
            res=max(res,f[n][i]);
        }
        cout<<res<<endl;
}

//895、最长上升子序列

没有严格按照岩石地皮分析法思考导致没想出来。

数组表示某个点之前的点,构成的子序列的最长长度。

状态的计算:循环之前的所有以小于i的点为结尾的子序列的长度,然后根据大小是否加一,是否更新。

#include<bits/stdc++.h>
using namespace std;
//895 最长上升子序列
const int N=1010;
int n;
int f[N],a[N];
int main()
{
    cin >> n;
    for(int i=1;i<=n;i++)cin>>a[i];
    memset(f,0x3f,sizeof f);
   //memset(a,0x3f,sizeof a);
    f[1]=1;
    for(int i=2;i<=n;i++)
    {
      f[i]=1;
      for(int j=1;j<=i;j++)
      {
          if(a[i]>a[j])
          {
              if(f[j]+1>f[i])
              {
                  f[i]=f[j]+1;
              }
          }
      }
    }

    cout<<f[n]<<endl;


}

897 最长公共子序列

状态计算看的题解,如果相等就是f[i-1][j-1]+1

如果不等,其中至少有一个不再公共子序列里面。

max(f[i-1][j],f[i][j-1],f[i-1][j-1]) 根据常识知道f[i-1][j-1]<=(f[i-1][j],f[i][j-1]的任意一个)

#include<bits/stdc++.h>
using namespace std;
//897 最长公共子序列
const int N=1010;
int n,m;
int f[N][N];
char a[N],b[N];
int main()
{
    cin >> n>>m;
    scanf("%s",a+1);
    scanf("%s",b+1);

    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            if(a[i]==b[j])
            {
                f[i][j]=f[i-1][j-1]+1;
            }
            else
            {
                f[i][j]=max(f[i-1][j],f[i][j-1]);
            }
        }
    }
    cout<<f[n][m]<<endl;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

appium+jenkins实例构建

自动化测试平台 Jenkins简介 是一个开源软件项目&#xff0c;是基于java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件的持续集成变成可能。 前面我们已经开完测试脚本&#xff0c;也使用bat 批处…

从零开始学习:如何使用Selenium和Python进行自动化测试?

安装selenium 打开命令控制符输入&#xff1a;pip install -U selenium 火狐浏览器安装firebug&#xff1a;www.firebug.com&#xff0c;调试所有网站语言&#xff0c;调试功能 Selenium IDE 是嵌入到Firefox 浏览器中的一个插件&#xff0c;实现简单的浏览器操 作的录制与回…

【微服务】------微服务架构技术栈

目前微服务早已火遍大江南北&#xff0c;对于开发来说&#xff0c;我们时刻关注着技术的迭代更新&#xff0c;而项目采用什么技术栈选型落地是开发、产品都需要关注的事情&#xff0c;该篇博客主要分享一些目前普遍公司都在用的技术栈&#xff0c;快来分享一下你当前所在用的技…

PS入门|如何使用“主体”功能进行抠图?

前言 前段时间讲到给各种图标和LOGO抠图的办法&#xff0c;分别使用的是 钢笔工具蒙版 PS入门&#xff5c;规规矩矩的图形怎么抠出来&#xff1f; 魔棒工具蒙版 PS入门&#xff5c;黑白色的图标怎么抠成透明背景 色阶蒙版 PS入门&#xff5c;目标比较复杂&#xff0c;但背景…

数据中台系统架构的探索之路:生产管理企业的数字化转型引擎-亿发

当前制造业面临着诸多问题。 1、系统繁杂&#xff0c;涉及多个子系统和应用&#xff0c;导致信息孤岛和数据孤立现象普遍存在。 2、其次是业务流程冗长&#xff0c;造成生产过程中的信息传递和协同困难&#xff0c;影响效率和质量。 3、数据应用问题也十分突出&#xff0c;包…

android平台下opencv的编译--包含扩展模块

由于项目需要使用安卓平台下opencv的扩展库&#xff0c;对于通用的opencv库&#xff0c; opencv官网提供了android的SDK 但未能提供扩展库&#xff0c;因此需要自己进行源码编译。本文记录android平台下opencv及其扩展库的交叉编译。 前提&#xff1a;主机已安装android-ndk交…

mybatis-plus与mybatis同时使用别名问题

在整合mybatis和mybatis-plus的时候发现一个小坑&#xff0c;单独使用mybatis&#xff0c;配置别名如下&#xff1a; #配置映射文件中指定的实体类的别名 mybatis.type-aliases-packagecom.jk.entity XML映射文件如下&#xff1a; <update id"update" paramete…

vue2 使用vue-org-tree demo

1.安装 npm i vue2-org-tree npm install -D less-loader less安装 less-loader出错解决办法&#xff0c;直接在package.json》devDependencies下面加入less和less-loader版本&#xff0c;然后执行npm i &#xff0c;我用的nodejs版本是 16.18.0&#xff0c;“webpack”: “^4…

Redis的双写一致性问题

双写一致性问题 1.先删除缓存或者先删除数据库都可能出现脏数据。 2.删除两次缓存&#xff0c;可以在一定程度上降低脏数据的出现。 3.延时是因为数据库一般采用主从分离&#xff0c;读写分离。延迟一会是让主节点把数据同步到从节点。 1.读写锁保证数据的强一致性 因为一般放…

java Web在线考试管理系统用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 在线考试管理系统是一套完善的web设计系统&#xff0c;对理解JSP java 编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&#xff0c;使…

DDoS攻击包含哪些层面?如何防护?

DDoS攻击&#xff08;分布式拒绝服务攻击&#xff09;是一种通过向目标服务器发送大量流量或请求&#xff0c;以使其无法正常工作的网络攻击手段。DDoS攻击涉及多个层面&#xff0c;在实施攻击时对网络基础架构、网络协议、应用层等进行攻击。下面将详细介绍DDoS攻击的层面。 1…

CentOS 7 升级 5.4 内核

MatrixOne 推荐部署使用的操作系统为 Debian 11、Ubuntu 20.04、CentOS 9 等 Kernel 内核版本高于 5.0 的操作系统。随着 CentOS 7 的支持周期接近尾声&#xff0c;社区不少小伙伴都在讨论用以替换的 Linux 操作系统&#xff0c;经过问卷调查&#xff0c;我们发现小伙伴们的操作…

eclipse .project

.project <?xml version"1.0" encoding"UTF-8"?> <projectDescription> <name>scrm-web</name> <comment></comment> <projects> </projects> <buildSpec> <buil…

C++数据结构与算法——贪心算法难题

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

配置交换机SSH管理和端口安全——实验2:配置交换机端口安全

实验目的 通过本实验可以掌握&#xff1a; 交换机管理地址配置及接口配置。查看交换机的MAC地址表。配置静态端口安全、动态端口安全和粘滞端口安全的方法 实验拓扑 配置交换机端口安全的实验拓扑如图所示。 配置交换机端口安全的实验拓扑 实验步骤 &#xff08;1&#x…

用友NC Cloud importhttpscer接口存在任意文件上传漏洞

声明&#xff1a; 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 简介 用友NC Cloud 是基于云计算技术的企业管理软件。它提…

web安全学习笔记(8)

记一下第十二节课的内容。 一、PHP文件包含的四种方式 Include和Include_once 操作系统会读取包含的文件的内容&#xff0c;并将它插入主文件中&#xff0c;include方式的文件包含会在包含失败的情况下输出警告信息&#xff0c;而include_once方式会检查包含的文件是否已经被…

CSS3新增

一些CSS3新增的功能 课程视频链接 目录 CSS3概述私有前缀长度单位remvwvhvmaxvmin 颜色设置方式ragbhslhsla 选择器动态伪类目标伪类语言伪类UI伪类结构伪类否定伪类伪元素 盒子属性box-sizing问题插播 宽度与设置的不同 resizebox-shadowopacity 背景属性background-originb…

状态模式(行为型)

目录 一、前言 二、状态模式 三、总结 一、前言 状态模式(State Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许一个对象在其内部状态改变时改变它的行为。对象看起来好像修改了它的类&#xff0c;但实际上&#xff0c;由于状态模式的引入&#xff0c;行为的变…

视频插针调研

视频插针 1、评估指标2、准确度3、实时4、视频流处理3、实时RIFE视频插帧测试 1、评估指标 参考&#xff1a;https://blog.csdn.net/weixin_43478836/article/details/104159648 https://blog.csdn.net/weixin_43605641/article/details/118088814 PSNR和SSIM PSNR数值越大表…