AcWing蓝桥杯辅导课:第三讲 数学与简单DP

news2024/11/13 10:31:41

AcWing 1205. 买不到的数目

在这里插入图片描述
思路:

裴蜀定理: 对任何整数 a a a b b b,存在整数 x x x y y y,使得 a x + b y = ( a , b ) ax + by = (a, b) ax+by=(a,b) ( a , b ) (a, b) (a,b)表示 a a a b b b的最大公因数,令 d = ( a , b ) d=(a, b) d=(a,b)。若 d = 1 d = 1 d=1,则 a n x + b n y = n d anx + bny = nd anx+bny=nd n n n 的取值即为整数 a a a b b b可以凑得的方案数,整数 a a a b b b凑不出来的数有一个上界,且一定小于 a b ab ab,因此可以枚举求凑不出来的最大值,或者使用结论:不能被表示出来的数有一个上界,上界为 a b − a − b ab - a - b abab

相关证明:a,b组合数不能表示的上界

思路:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

/**
 * @Description
 * @Author: PrinceHan
 * @CreateTime: 2023/2/27 9:30
 */
public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
        String[] nm = in.readLine().split(" ");
        
        int n = Integer.parseInt(nm[0]), m = Integer.parseInt(nm[1]);
        
        out.println(n * m - n - m);
        out.flush();
    }

}

AcWing 1211. 蚂蚁感冒

在这里插入图片描述
思路:

首先判断感冒的蚂蚁往哪走。

  1. 往左走,则在该蚂蚁左边且往右走的蚂蚁都会感染。
  2. 往右走,则在该蚂蚁右边且往左走的蚂蚁都会感染。

否则最后感染的只有初始感冒的那一只。

代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

/**
 * @Description
 * @Author: PrinceHan
 * @CreateTime: 2023/3/1 9:22
 */
public class Main {

    static final int N = 55;
    static int[] a = new int[N];
    static int n;

    public static void main(String[] args) throws IOException{
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));

        n = Integer.parseInt(in.readLine());
        String[] s = in.readLine().split(" ");
        int start = 0, l = 0, r = 0;
        // 1表示正,-1表示负
        int f = 0;
        for (int i = 1; i <= n; i++) {
            a[i] = Integer.parseInt(s[i - 1]);
            if (i == 1)
            {
                start = a[i];
                f = start > 0 ? 1 : -1;
            }
            // 往右走并且在感冒蚂蚁左边的
            if (a[i] > 0 && Math.abs(a[i]) < Math.abs(start)) l++;
            // 往左走并且在感冒蚂蚁右边的
            if (a[i] < 0 && Math.abs(a[i]) > Math.abs(start)) r++;
        }

        // 感冒蚂蚁往右走 但是 右边没有往左走
        // 感冒蚂蚁往左走 但是 左边没有往右走
        if ((f == 1 && r == 0) || (f == -1 && l == 0)) out.println(1);
        else out.println(l + r + 1);
        out.flush();

    }
}

AcWing 1216. 饮料换购

在这里插入图片描述
思路:

瓶盖数等于饮料数,每换一瓶饮料,瓶盖数 - 3,饮料数 + 1, 瓶盖数 + 1,最后当瓶盖数小于3时,就不能换购了。

代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

/**
 * @Description
 * @Author: PrinceHan
 * @CreateTime: 2023/2/27 9:34
 */
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
        int n = Integer.parseInt(in.readLine().split(" ")[0]);
        int ans = n;
        // 瓶盖数
        int cnt = n;

        while (cnt >= 3) {
            int tmp = cnt / 3;
            ans += tmp;
            cnt %= 3;
            cnt += tmp;
        }

        out.println(ans);
        out.flush();
    }
}

AcWing 2. 01背包问题

在这里插入图片描述

思路:
01背包问题,表示每个物品要么放,要么不放。从集合的角度分析DP问题,状态表示为:选择前i个物品,总体积小于等于j的选法的集合,属性f[i][j]表示价值的最大值。状态计算,因为每个状态可以表示为选择当前的物品,或者不选当前的物品,二者价值取最大值即可,即状态转移方程为:
f [ i ] [ j ] = m a x ( f [ i − 1 ] [ j ] , f [ i − 1 ] [ j − v i ] + w i ) , j ≥ v i f[i][j] = max(f[i - 1][j], f[i - 1][j - v_i]+w_i), j \ge v_i f[i][j]=max(f[i1][j],f[i1][jvi]+wi),jvi

一维优化

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

变化为
f[j] = f[j] // 省略
f[j] = max(f[j], f[j - v[i]] + w[i])

由于f[i][j]需要用到第i - 1层的结果,j-v[i]严格小于j, j - v[i] 在第i层已经被算过了,所以用j-v[i]更新j时,用的是第i层的结果,j逆序,则 j 会比 j - v[i]先被计算,所以用到 j - v[i]时,用的是上一层即第 i - 1层的结果。

代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

/**
 * @Description
 * @Author: PrinceHan
 * @CreateTime: 2023/2/27 9:39
 */
public class Main {

    static final int ln = 1005;
    static int[] v = new int[ln], w = new int[ln];
    static int[] dp = new int[ln];
    static int N, V;

    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
        String[] nv = in.readLine().split(" ");
        N = Integer.parseInt(nv[0]);
        V = Integer.parseInt(nv[1]);

        for (int i = 1; i <= N; i++) {
            String[] s = in.readLine().split(" ");
            v[i] = Integer.parseInt(s[0]);
            w[i] = Integer.parseInt(s[1]);
        }
        
        for (int i = 1; i <= N; i++) 
            for (int j = V; j >= v[i]; j--)
                dp[j] = Math.max(dp[j], dp[j - v[i]] + w[i]);
            
        out.println(dp[V]);
        out.flush();
    }
}

AcWing 1015. 摘花生

在这里插入图片描述

思路:

到达每一点有两种方式,一种是从该点左边,一种是从该点上边到达,则最大价值即为这两种方式的最大价值,加上该点的价值。

代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;


/**
 * @Description
 * @Author: PrinceHan
 * @CreateTime: 2023/3/1 9:55
 */
public class Main {
    static final int N = 105;
    static int[][] f = new int[N][N];
    static int t, r, c;

    public static void main(String[] args) throws IOException{
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));

        String T = in.readLine();
        t = Integer.parseInt(T);

        while (t-- != 0) {
            String[] rc = in.readLine().split(" ");
            r = Integer.parseInt(rc[0]);
            c = Integer.parseInt(rc[1]);

            for (int i = 1; i <= r; i++) {
                String[] s = in.readLine().split(" ");
                for (int j = 1; j <= c; j++) {
                    f[i][j] = Integer.parseInt(s[j - 1]);
                }
            }

            for (int i = 1; i <= r; i++) {
                for (int j = 1; j <= c; j++) {
                    f[i][j] += Math.max(f[i][j - 1], f[i - 1][j]);
                }
            }

            out.println(f[r][c]);
            out.flush();
        }
    }
}

AcWing 895. 最长上升子序列

在这里插入图片描述
思路:

线性DP的使用,状态是一维的,转移又是一维的,所以一共是两维。枚举每一个整数,则以该整数结尾的子序列的长度初始化为1,枚举该数之前的数,若大于之前的数,则状态转移,取长度的最大值。最后计算以每个整数结尾的子序列长度的最大值。

状态转移方程:

d p [ i ] = m a x ( d p [ i ] , d p [ j + 1 ] + 1 )   a [ i ] > a [ j ] ,   1 ≤ j ≤ i dp[i] = max(dp[i], dp[j+1] + 1) \: a[i] > a[j] ,\: 1 \le j \le i dp[i]=max(dp[i],dp[j+1]+1)a[i]>a[j],1ji

代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

/**
 * @Description
 * @Author: PrinceHan
 * @CreateTime: 2023/2/27 9:54
 */
public class Main {

    static final int ln = 1005;
    static int[] a = new int[ln];
    static int[] dp = new int[ln];
    static int n;

    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
        String[] nv = in.readLine().split(" ");
        n = Integer.parseInt(nv[0]);

        String[] s = in.readLine().split(" ");

        for (int i = 1; i <= n; i++) a[i] = Integer.parseInt(s[i - 1]);

        int ans = 0;
        for (int i = 1; i <= n; i++) {
            dp[i] = 1;
            for (int j = i - 1; j > 0; j--) {
                if (a[i] > a[j]) dp[i] = Math.max(dp[i], dp[j] + 1);
            }
            ans = Math.max(ans, dp[i]);
        }


        out.println(ans);
        out.flush();
    }
}

AcWing 1212. 地宫取宝

在这里插入图片描述
思路:

本题数据范围较小,所以可能有多维,用闫氏DP分析法进行分析。

在这里插入图片描述
由于 0 ≤ C i ≤ 12 0 \le C_i \le 12 0Ci12,放价值为0的和不放物品等价,为了区分,将每一个物品的价值加一,则 1 ≤ C i ′ ≤ 13 1 \le C_i' \le 13 1Ci13

代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

/**
 * @Description
 * @Author: PrinceHan
 * @CreateTime: 2023/3/1 10:15
 */
public class AC1212 {

    static final int N = 55, mod = 1000000007;
    static int[][] c = new int[N][N];
    // 前两维表示位置,第三维表示取了k个物品,第思维表示当前最大值
    static int[][][][] f = new int[N][N][13][14];
    static int n, m, k;

    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
        String[] nmk = in.readLine().split(" ");

        n = Integer.parseInt(nmk[0]);
        m = Integer.parseInt(nmk[1]);
        k = Integer.parseInt(nmk[2]);


        for (int i = 1; i <= n; i++) {
            String[] s = in.readLine().split(" ");
            for (int j = 1; j <= m; j++) {
                c[i][j] = Integer.parseInt(s[j - 1]);
                // 因为不放物品与放价值为0的物品 价值是一样的 加1是为了区分
                // -1~12 0~13
                c[i][j]++;
            }
        }

        // 不取第一个物品的方案数为1
        f[1][1][0][0] = 1;
        // 取第一个物品的方案数为1
        f[1][1][1][c[1][1]] = 1;

        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                for (int u = 0; u <= k; u++) {
                    for (int v = 0; v <= 13; v++) {
                        // 不选 (i, j)
                        f[i][j][u][v] = (f[i][j][u][v] + f[i - 1][j][u][v]) % mod;
                        f[i][j][u][v] = (f[i][j][u][v] + f[i][j - 1][u][v]) % mod;
                        // 选 (i, j) v表示选择之后价值的最大值,所以选择的话 c[i][j] = v
                        if (u > 0 && c[i][j] == v) {
                            for (int c = 0; c < v; c++) {
                                f[i][j][u][v] = (f[i][j][u][v] + f[i - 1][j][u - 1][c]) % mod;
                                f[i][j][u][v] = (f[i][j][u][v] + f[i][j - 1][u - 1][c]) % mod;
                            }
                        }
                    }
                }
            }
        }

        int res = 0;
        for (int i = 0; i <= 13; i++)
            res = (res + f[n][m][k][i]) % mod;

        out.println(res);
        out.flush();
    }

}

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

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

相关文章

Mysql-DML语句

DML语句 数据操作语言DML&#xff08;Data Manipulation Langua&#xff09; 是SQL语言的一个分类&#xff0c;用于对表的数据进行增&#xff0c;删&#xff0c;改&#xff0c;查 创建表 CREATE TABLE 语句用于创建数据库中的表。 语法&#xff1a; CREATE TABLE 表名称 ( …

速度vs精度:在AutoDock Vina中,不同对接盒子Box Size 、 Exhaustiveness对配体姿势精度的影响

速度vs精度&#xff1a;在AutoDock Vina中&#xff0c;不同对接盒子Box Size 、 Exhaustiveness对配体姿势精度的影响 介绍&#xff1a; 在Autodock Vina的中&#xff0c;用户需要提供两个关键的相关参数: 1)盒子大小&#xff08;Box Size&#xff09;&#xff0c;即对接搜索…

已获近百亿订单,均胜电子新一代智能网联产品领跑市场

伴随着整车智能化的升级&#xff0c;以及ADAS逐步向高阶自动驾驶的演进&#xff0c;5G车联网进入了发展的快车道。 根据《高工智能汽车研究院》数据显示&#xff0c;2022年前装标配5G联网功能搭载交付41.74万辆&#xff08;其中&#xff0c;V2X功能搭载量达到17.01万辆&#x…

集装箱箱号识别API免费,中国上海人工智能企业CIMCAI中集飞瞳,集装箱人工智能平台全球近4千企业用户,箱况检测残损识别缺陷检验

集装箱箱号识别API免费&#xff0c;中国上海人工智能企业CIMCAI飞瞳引擎™集装箱人工智能平台全球近4千企业用户&#xff0c;全球领先的飞瞳引擎™AI集装箱识别云服务&#xff0c;集装箱残损识别箱况检测缺陷检验&#xff0c;小程序拍照检测或支持API接口二次开发&#xff0c;应…

2022年考研结果已出,你上岸了吗?

官方公布&#xff1a;2022年考研人数为457万。 2月20号左右&#xff0c;全国考研分数已经陆续公布&#xff0c;现在已经过去一周左右的时间了&#xff0c;你上岸了吗&#xff0c;还是在等调剂&#xff0c;或者已经知道落榜不知道何去何从&#xff1f; 考研的热潮在近几年席卷…

服务器配置 | 在Windows本地打开服务器端Tensorboard结果

文章目录方法1&#xff1a;直接cmd使用ssh登录远程服务器方法2&#xff1a;利用Xshell设置本地端口进行监听方法3&#xff1a;利用MobaXterm设置本地端口监听这里介绍三个方法&#xff0c;在在Windows本地打开服务器端Tensorboard结果 方法1&#xff1a;直接cmd使用ssh登录远程…

Web3中文|交易暂停!BUSD再受重创!

本周一&#xff0c;美国加密交易所Coinbase在推特上宣布&#xff0c;由于稳定币不符合上市标准&#xff0c;Coinbase将从3月13日起暂停BUSD的交易。一位发言人告诉CoinDesk&#xff1a;“我们是基于内部的审查和监控做出这一决定的&#xff0c;在审查BUSD时&#xff0c;我们认为…

无线WiFi安全渗透与攻防(四)之kismet的使用

系列文章 无线WiFi安全渗透与攻防(一)之无线安全环境搭建 无线WiFi安全渗透与攻防(二)之打造专属字典 无线WiFi安全渗透与攻防(三)之Windows扫描wifi和破解WiFi密码 kismet 如果要进行无线网络渗透测试&#xff0c;则必须先扫描所有有效的无线接入点。刚好在Kali Linux中&am…

清理c盘空间的方法总结,最详细的c盘清理攻略

清理C盘空间是电脑维护的重要步骤之一&#xff0c;C盘是Windows操作系统的核心部分&#xff0c;保存了许多重要的系统文件&#xff0c;因此空间不足会影响计算机的性能和稳定性。下面是一些清理C盘空间的方法分享。 一.清理c盘空间的方法 1、清理临时文件 在使用Windows系统时…

【Leetcode 剑指Offer】第 8 天 动态规划(简单)

动规剑指 Offer 10- I. 斐波那契数列动态规划动态规划的优化【两种赋值】剑指 Offer 10- II. 青蛙跳台阶问题剑指 Offer 63. 股票的最大利润考虑效率优化【时间空间】python初始化无穷大或无穷小值写在前面&#xff1a; 动规分析必备&#xff1a;状态定义、状态转移方程、初始状…

Vue3 + setup + ts 使用总结

阅读vue的英文官网 中文的vue官网比vue的英文官网差很多&#xff0c;这个其实很容易理解&#xff0c;毕竟vue是服务于全球的开源项目之一。 所以程序员的第一生产力还是英语 不管学什么都要去获取第一手资料&#xff0c;不要看中文官网&#xff0c;直接去看英文官网 vite初…

微服务架构简介

微服务 软件架构是一个包含各种组织的系统组织&#xff0c;这些组件包括 Web服务器, 应用服务器, 数据库,存储, 通讯层), 它们彼此或和环境存在关系。系统架构的目标是解决利益相关者的关注点。 image Conway’s law: Organizations which design systems[...] are constrained…

jenkins集成tapd插件

文章目录1. 在tapd上关联jenkins1.1 公司管理员登录tapd&#xff0c;进入设置—开发集成—服务集成1.2 下载插件&#xff0c;并在jenkins上安装。2. 在tapd上关联jenkins在jenkins配置tapd插件2.1 生成Jenkins API Token3. 进入某个项目&#xff0c;启用流水线并配置3.1 选择je…

第二章 opengl实现三角形

OpenGL三角形关注参数图形渲染管线顶点输入顶点着色器编译着色器片段着色器着色器程序链接顶点属性元素缓冲对象三角形关注参数 顶点数组对象&#xff1a;Vertex Array Object&#xff0c;VAO 顶点缓冲对象&#xff1a;Vertex Buffer Object&#xff0c;VBO 元素缓冲对象&…

Windows10下使用Intel SGX功能(二):helloworld流程分析

文章目录参考文献helloworld 代码解读代码目录结构调用流程1. 首先定义 host 和 enclave 之间相互调用的函数2. 实现 enclave 端的 enclave_helloworld() 逻辑3. 实现 host 端的 host_helloworld() 逻辑4. 编译 enclave 应用程序4.1 使用 oeedger8r 编译 helloworld.edl 的 unt…

学生专用台灯怎么选?给孩子买台灯需要注意什么

台灯是现在很多学生孩子都使用比较多的产品&#xff0c;晚上看书学习&#xff0c;停笔沉思&#xff0c;台灯柔和舒适的光照&#xff0c;可以营造良好的氛围&#xff0c;也能有效保护眼睛&#xff0c;不受光线刺激、辐射伤害。 那么学生专用台灯该怎么选呢&#xff1f; ①一个…

捍宇医疗再冲刺科创板上市:核心产品专利来自购买,暂未商业化

2023年3月1日&#xff0c;上海捍宇医疗科技股份有限公司&#xff08;下称“捍宇医疗”&#xff09;递交招股书&#xff0c;准备在科创板上市。据贝多财经了解&#xff0c;捍宇医疗曾冲刺港交所上市&#xff0c;并于2021年9月通过聆讯&#xff0c;但最终放弃了港交所上市的打算。…

后端必备之Vue基础【黑马程序员】

黑马程序员4小时入门Vue传送门 1. 简介 Vue是一个操作JavaScript的框架&#xff0c;类似于jQuery&#xff0c;但比jQuery好用&#xff0c;是现在的主流 2. 测试例子 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /&…

LeetCode-746. 使用最小花费爬楼梯

题目来源 746. 使用最小花费爬楼梯 动态规划 动态规划五部曲 1.确定dp数组以及下标的含义 使用动态规划&#xff0c;就要有一个数组来记录状态&#xff0c;本题只需要一个一维数组dp[i]就可以了。 dp[i]的定义&#xff1a;到达第i台阶所花费的最少体力为dp[i]。 2.确定递推…

The simplest way to get started with Stable Diffusion on Ubuntu

link1 link2 Stable Diffusion is a machine learning model that can generate images from natural language descriptions. Because it’s open source, it’s also easy to run it locally, which makes it very convenient to experiment with in your own time. The sim…