CSP-J/S 动态规划模版讲解

【CSP考题扩展】动态规划入门(1) 动态规划(Dynamic Programming,简称DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学等领域中使用的,用来解决特定类型问题的算法思想。其核心思想在于解决复杂问题的过程中,把问题分解为相对简单的子问题,通过解决这些子问题来解决整个问题。 阅读详情

                               CSP-J/S 动态规划模版讲解

                                        https://algo.codefather.cn/https://algo.codefather.cn/

part 1:动态规划起源与理解

起源

在一次信奥赛中一位选手使用一种新算法秒掉了其他选手,该算法时间复杂度比那些O(N2)快多了,定名为动态规划

理解

实际上就是做出一个表格,每一个代表一个状态,所以做这个最需要的就是状态转移方程
其实动态规划(Dynamic Programming)是一种通过将复杂问题分解为更简单的子问题来解决问题的方法。它适用于有重叠子问题和最优子结构性质的问题。

part 2:为什么讲动态规划而不是其他算法

请看2019~2023年CSP第一轮考试知识点

年份阅读程序1阅读程序2阅读程序3完善程序1完善程序2
2019枚举递推分治递归计数排序
2020枚举枚举质因数分解约瑟夫环二分
2021递归动规二分质因数分解贪心
2022位运算动规二分递推广搜
2023枚举字符串质因数分解二分动规

可以看到,在2019~2023年间二分考了4次,枚举考了3次,而动规也考了3次。
但是为什么不讲二分或枚举呢?
很简单,因为枚举在编程题不经常考,
而二分只是一种思想,并没有固定代码模版 (换句话说就是不好讲)。
可以看到,动规在一轮考的次数不算少,所以二轮占的比重一定很大(基本3,4题里面肯定有一道)。再看看历年真题,大部分题目不想超时就得用特殊的方法,动规就是其中的一种

part 3:代码模版

第一类:背包问题

听到他一定很耳熟,大部分背包问题都是用动规求解
代码都很相似,不要搞错了

1.1 01背包

就是这种东西要么不装要么装

二维状态转移方程:
for(int i=1;i<=n;i++){
    for(int j=1;j<=V;j++){
        f[i][j]=f[i-1][j];
        if(v[i]<=j){
            f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]);
        }
    }
}
cout<<f[n][V];
一维状态转移方程:
for(int i=1;i<=n;i++){
    for(int j=V;j>=v[i];j--){
        f[j]=max(f[j],f[j-v[i]]+w[i]);
    }
}
cout<<f[V];
1.2 完全背包
二维状态转移方程:
for(int i=1;i<=n;i++){
    for(int j=1;j<=V;j++){
        f[i][j]=f[i-1][j];
        if(j>=v[i]){
            f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]);
        }
    }
}
cout<<f[n][V];
一维状态转移方程:
for(int i=1;i<=n;i++){
    for(int j=v[i];j<=V;j++){
        f[j]=max(f[j],f[j-v[i]]+w[i]);
    }
}
cout<<f[V];
1.3 多重背包
二维状态转移方程:
for(int i=1;i<=n;i++){
    for(int j=V;j>=v[i];j--){
        for(int k=0;k<=s[i]&&k*v[i]<=j;i++)
            f[j]=max(f[j-k*v[i]]+k*w[i]);
    }
}

上述代码时间复杂度约为:
O(n⋅m⋅s),很容易超时

多重背包二进制优化:转为二进制,用01背包求解
for(int i=1;i<=n;i++){
    int vi,wi,si,t=1;
    cin>>vi>>wi>>si;
    while(si>=t){
        v[++cnt]=vi*t;
        w[cnt]=wi*t;
        si-=t;
        t*=2;
    }
    if(s>0){
        v[++cnt]=vi*si;
        w[cnt]=wi*si;
    }
}
for(int i=1;i<=cnt;i++){
    for(int j=V;j>=v[i];j--)
        f[j]=max(f[j],f[j-v[i]]+w[i]);
}
cout<<f[V];

这样就可以减少一层循环,比原来的快约s倍

1.4 分组背包
for(int i=1;i<=n;i++){
    for(int j=V;j>=1;j--){
        for(int k=1;k<=s[i];k++){
            if(j>=v[i][k])
            	f[j]=max(f[j],f[j-v[i][k]]+v[i][k]);
        }
    }
}
cout<<f[V];

第二类:线性DP

2.1:数字三角形
f[1][1]=a[1][1];
for(int i=2;i<=n;i++){
    for(int j=1;j<=i;j++){
        f[i][j]=max(f[i-1][j-1]+a[i][j],f[i-1][j]+a[i][j]);
    }
}
2.2:最长上升子序列LIS
for(int i=1;i<=n;i++){
    f[i]=1;
    for(int j=1;j<=i;j++){
        if(a[j]<a[i])
            f[i]=max(f[i],f[j]+1);
    }
}
int ans=0;
for(int i=0;i<=n;i++)
    ans=max(ans,f[i]);
cout<<ans;

第三类:区间DP

3.1:石子合并

描述

在一个操场上一排地摆放着N堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。
设计一个程序,计算出将N堆石子合并成一堆的最小得分。

输入描述

第一行为一个正整数N (2≤N≤100);
以下N行,每行一个正整数,小于10000,分别表示第i堆石子的个数(1≤i≤N)。

输出描述

为一个正整数,即最小得分。

用例输入 1
7
13
7
8
16
21
4
18
用例输出 1
239
来源

动态规划 区间动归

for(int i=1;i<=n;i++)
    s[i]+=s[i-1];
for(int len 2;len<=n;len++){
    for(int i=1;i+len-1<=n;i++){
        int l=i,r=i+len+1;
        for(int k=l;k<r;k++)
            f[l][r]=min(f[l][r],f[l][k]+f[k+1][r]+s[r]-s[l-1]);
    }
}
cout<<f[1][n];

THE END

【信息学奥赛】CSP-J/S初赛07 排序算法及其他算法在初赛中的考察 排序是一种将一组数据按照特定规则进行排列的算法,可以帮助我们更方便地查找和处理数据,是计算机科学中非常重要的基本操作之一。 阅读详情

相关推荐

CSP-S五年真题速查宝典

搜索“CSP-S”+年份(如“CSP-S 2022”)可找到对应资源。OI Wiki(https://oi-wiki.org/)是开源的信息学竞赛知识库,收录了CSP-S的题目分析和算法讲解,部分内容附代码实现。一些开源项目(如“OI-Archive”)汇总了真题和解析,可通过GitHub搜索关键词“CSP-S archive”或“NOIP真题”找到。CCF是CSP-S的主办方,官网(https://www.ccf.org.cn/)会发布历年真题和部分官方解答。:给定一个数列,求满足条件的最长子序列长度。

boat_lu的博客 1777

【CSP考点总结】(1)

定义。

fzy2003的博客 1354

2024CSP-J题目简析

1.题目大意:给定n张扑克牌和这n张扑克牌的花色和大小(),需要输出还需要多少张牌才能凑齐一副扑克牌(这里,所以共52张)。2.思路概要:由于扑克牌会有重复,所以重要的操作就是字符串的处理和去重。这里先介绍下,它的作用是“去掉”容器中相邻元素的重复元素。(这里去掉要加一个引号,是因为实质上是一个伪去除,它会把重复的元素添加到容器末尾,而返回值是去重之后的尾地址。)这道题并不难,所以也不过多赘述。

2301_81408620的博客 1662

【如何掌握CSP-J 信奥赛中的动态规划算法】

【如何掌握CSP-J 信奥赛中的广搜算法】

王老师青少年编程 1525

CSP-J/S复赛算法 动态规划初步

动态规划(Dynamic Programming)其实是一个很聪明的“拆问题”的方法。我们常常会遇到一些很大的问题,比如要做很多选择,走很多步才能完成。动态规划就是把这些问题一步步拆成小问题来解决,每次解决小问题的时候,都记住这个问题的答案,以后如果再遇到这个问题,就不用重新计算了,直接用之前的答案。动态规划通常用来解决那些“从多个选择中找到最优解”的问题,比如找最大值、最小值、最长路径、最短路径等。通过把问题一步步分解并保存中间结果,动态规划能让我们高效地解决这些问题。状态。

m0_62599305的博客 1443

CSP-J/S 复赛算法 背包DP

背包问题是算法竞赛中的经典题型之一,特别是在CSP-J/S(中国信息学奥林匹克竞赛)复赛中,动态规划(DP)解决背包问题是一个常见且基础的重要内容。背包DP问题通过构建状态转移方程,利用「无后效性」这一特性,可以高效地解决一系列组合优化问题。本文将简要介绍如何在背包问题中运用动态规划思想,通过对状态的设计与转移公式的推导,最终求解出最优解。这种方法不仅是算法竞赛中的常见考点,也是在实际应用中有广泛运用的技巧。

m0_62599305的博客 1215

CCF CSP 有趣的数 动态规划

问题描述   我们把一个数称为有趣的,当且仅当:   1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次。   2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前。   3. 最高位数字不为0。   因此,符合我们定义的最小的有趣的数是2013。除此以外,4位的有趣的数还有两个:2031和2301。   请计算恰好有n位的有趣的数的个数。由于答案

more_ugly_less_bug的博客 7511

历届NOIp动态规划梳理 (54页)--PASCAL 好.pdf

历届NOIp动态规划梳理 (54页)--PASCAL 好.pdf

CCF CSP 第37次(2025.03)(4_集体锻炼_C++)(动态规划)

CCF CSP 第37次(2025.03)(4_集体锻炼_C++) 题目描述: 现在一共有 n 个弗艾西西大学的同学站成一排,同学们的体魄各有不同,第之个同学具有力量值 ai。 在集体锻炼的过程中,老师会指定队列中连续一段同学,让他们协作完成一项运动,这项运动的强度由这些同学的力量值决定,县体而言,假设老师选择了第 l 到第 r 个同学,所进 行运动的强度就是 gcd(al, al+1,...,ar),其中 gcd 表示最大公约数。特别地,当l=r时,我们认为运动的强度就等于 al。

huayimenghan的博客 1648

Windowns下Git环境配置-命令行方式

文章目录一、配置Git1.1 下载Git并安装1.2 配置本地Git用户名和邮箱1.3 注册GitHub二、生成本地公钥,放到GitHub上-SSH Key2.1 生成本地公钥命令2.2 查看生成的公钥2.3 在GitHub放上公钥并测试连通性三、创建项目实操四、可能出现的问题4.1.push不成功4.2.提示SSL的问题4.3.域名不能解析的问题4.4.如果github连接不上的问题 一、配置Git 1.1 下载Git并安装 Git官网 默认安装,根据需要修改安装路径 1.2 配置本地Git用户名和邮箱

学习工作笔记 1135

深度探索:机器学习中的最大似然估计(MLE)原理及其应用

最大似然估计作为统计推断的核心方法,在机器学习领域具有广泛的应用价值和深远影响。尽管存在对模型假设敏感、易受异常值影响等局限性,但其直观的原理、坚实的理论基础以及高效的实现方式使其在实践中仍占据主导地位。随着深度学习、强化学习等新兴领域的快速发展,最大似然估计将继续演化并适应新的模型结构与优化框架。同时,结合现代优化算法、并行计算技术以及贝叶斯方法的融合,最大似然估计有望在保持其核心优势的同时,进一步提升参数估计的准确性和鲁棒性,为未来的机器学习研究与应用开辟更广阔的道路。

qq_51320133的博客 1万+

2024 CSP-J2 CSP-S2 第2轮 复赛 真题 讲解、解析

2024 CSP-J2 CSP-S2 第2轮 复赛 真题 讲解、解析

青少年趣味编程 3318

基础的pdf病毒木马

基础的pdf病毒木马 环境: 攻击机:Kali 目标操作系统:Windows 10或Windows 7 (关闭防火墙和安全软件) 目标软件:Adobe Reader 8.1.2 msf框架搜索:adobe-pdf 1.打开msfconsole 2.搜索 adobe_pdf模块 3.加载攻击模块并设置payload 4.运行生成pdf 5.将pdf拖入到win10 6.打开msf,加...

小小猪的博客 4624

CSP-J/S初赛全面备考指南(C++版)

本文为CSP-J/S初赛C++版备考指南,系统梳理了核心考点与备考策略。主要内容包括:1)计算机体系结构与数据表示等基础知识;2)C++指针、内存管理等语法特性;3)算法与数据结构重点,如时间复杂度分析、树结构算法;4)针对单选、程序阅读等题型的解题技巧;5)J组与S组的差异化备考建议。文章特别强调算法题分值占比持续上升的趋势,提供了动态规划、STL容器等高频考点详解,并附有地区分数线差异分析和真题示例,帮助考生高效备考。

Sunnyside_______的博客 3957

保姆级教程:在Ubuntu 22.04上用VLLM+OpenWebUI部署DeepSeek-R1-14B(含Q8量化模型下载)

本文提供在Ubuntu 22.04上使用VLLM和OpenWebUI部署DeepSeek-R1-14B大语言模型的完整教程,包括环境配置、模型下载、VLLM参数调优及OpenWebUI集成。特别针对Q8量化模型优化部署流程,解决CUDA版本冲突等常见问题,适合开发者快速搭建本地AI对话系统。

weixin_26712075的博客 430

简易电梯控制系统设计(两层楼)(

(电子科技大学 数字系统实验二 结课验收项目 ) 题目要求:

m0_48801027的博客 1万+

CSP-J2024 T1 - T3 详解 && CSP -J2025 注意事项

本文解析了CSP-J2024考试中T1至T3的题目解法。T1使用桶排统计缺失扑克牌;T2通过DFS实现地图探险,强调多组测试需清空数据;T3采用数学规律解题,针对n模7的不同余数给出相应解法。文章提供了AC代码,适合初学者参考。同时提醒考生注意2025年考试中的这些要点,如基础算法的应用和数学思维的培养。

初心如磐,逐梦前行||b站@一个空客迷 2545

Security Onion的部署(超详细)

本文介绍了开源入侵检测系统securityonion的部署

qq_72583325的博客 6069

2024 csp-j 第二轮讲解+感受

2024年10月,正常迎来了csp-j竞赛的第二轮考试。虽然一等分数线是200分左右,比去年高出不少,但幸运的是前三题都很简单,轻松可以300起步。先来看一下讲解吧!

jzoj_ylz的博客 1843

第77步 时间序列建模实战:多因素预测 vol-2(以决策树回归为例)

第77步 时间序列建模实战:多因素预测 vol-2(以决策树回归为例)

Jet4505的博客 1008

AgentScope Java 2.0 项目实战:从零构建企业级自主Coding Agent

本文基于 AgentScope Java 框架,完整拆解两个生产级 AI Agent 项目的从零开发全过程。其一是企业级自主编码机器人(agentscope-codingagent),支持 Issue→PR 自动实现、PR Code Review、Docker 沙箱隔离执行与多通道接入;其二是个人 AI 助手管理平台(agentscope-paw),采用 Spring Boot + React 全栈架构,支持多 Agent、技能市场与多 IM 通道。

program哲学 838

视频教程-中学生C++信息学奥赛一本通基础算法CSP-J/S网课 青少年竞赛NOIP视频-C/C++

中学生C++信息学奥赛一本通基础算法CSP-J/S网课 青少年竞赛NOIP视频 ...

weixin_32666969的博客 2903

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

CSP-J/S 前缀和讲义

设原数组为 a[1],a[2],…,a[n]a[1],a[2],…,a[n],定义前缀和数组 ss:特别地,定义 s[0]=0s[0]=0,表示空区间的前缀和。前缀和数组可以通过递推得到:这个公式的含义是:前 ii 个元素的和等于前 i−1i−1 个元素的和再加上第 ii 个元素。二维前缀和用于处理矩阵中的子矩阵求和问题。设原矩阵为 a[i][j]a[i][j],其中 1≤i≤n1≤i≤n,1≤j≤m1≤j≤m。

2501_91251905的博客 187

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

CSP-J 2025总结

在做这类比赛时,在想不到一百分的解法时,也要冷静的写完部分分,如第四道题和第三道题.并且做好时间分配,避免一道题用很长时间.但也要及时复习之前的知识,以便随时可以用,如第四题的01背包问题我之前学过但由于考试时没有看出来是01背包问题,所以写了搜索. 所以以后比赛时,要保持这次做的好的地方,并继续提高其他方面.a_1a_1dp_ip_il_il_i2*a_i。

Summer_Mxl的博客 806

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

CSP-J/S初赛知识点精讲-常用算法

本文介绍了计算机科学中常用的算法分类与应用。排序算法分为比较类和非比较类,分析了算法的稳定性;枚举法通过穷举所有可能解决问题;递推和递归用于问题分解;二分查找针对有序数据;贪心算法追求局部最优;搜索算法包括深度优先和广度优先策略;分治法和动态规划则用于复杂问题的分解与优化。文中详细阐述了各类算法的基本思想、适用场景及实现要点,为算法选择与程序设计提供了系统指导。

stillwatersss的博客 1074

CSP-J/S竞赛家长必看:如何为孩子选择靠谱的编程培训机构?

本文为家长提供了科学筛选CSP-J/S竞赛编程培训机构的7个黄金法则,包括理解竞赛核心需求、评估师资力量、拆解课程体系等关键维度。帮助家长避开常见误区,选择真正能提升孩子算法设计和编程实践能力的优质机构,为竞赛表现奠定坚实基础。

weixin_30399821的博客 354
上一篇: P2920 [USACO08NOV] Time Management S
下一篇: python和C++有什么相同点和不同点
--迈克狐--
博客等级 码龄2年 35粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值