惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
U
Unit 42
博客园 - 叶小钗
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
B
Blog
GbyAI
GbyAI
Google DeepMind News
Google DeepMind News
博客园 - 【当耐特】
阮一峰的网络日志
阮一峰的网络日志
The Cloudflare Blog
N
Netflix TechBlog - Medium
P
Privacy International News Feed
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
G
Google Developers Blog
Recorded Future
Recorded Future
The Hacker News
The Hacker News
D
Darknet – Hacking Tools, Hacker News & Cyber Security
B
Blog RSS Feed
G
GRAHAM CLULEY
A
Arctic Wolf
N
News | PayPal Newsroom
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
The Register - Security
The Register - Security
Application and Cybersecurity Blog
Application and Cybersecurity Blog
V
Visual Studio Blog
Webroot Blog
Webroot Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 三生石上(FineUI控件)
aimingoo的专栏
aimingoo的专栏
P
Proofpoint News Feed
H
Heimdal Security Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Microsoft Azure Blog
Microsoft Azure Blog
小众软件
小众软件
M
MIT News - Artificial intelligence
V2EX - 技术
V2EX - 技术
Jina AI
Jina AI
TaoSecurity Blog
TaoSecurity Blog
NISL@THU
NISL@THU
云风的 BLOG
云风的 BLOG
爱范儿
爱范儿
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Threat Research - Cisco Blogs
WordPress大学
WordPress大学
V
V2EX
Cyberwarzone
Cyberwarzone
Stack Overflow Blog
Stack Overflow Blog
Cloudbric
Cloudbric
H
Hackread – Cybersecurity News, Data Breaches, AI and More

faryou的博客

出租车上的对话 faryou的博客-告别小高一 faryou的博客-中考 · 竞赛 · 生活 · 思考 5月月考 - faryou的博客 - 日记 faryou的博客-五一回老家 【汇编 - 功能】中断安装中断实现 【汇编&硬件】时钟中断的具体实现 faryou的博客-这些年,我不再看《熊出没》 【汇编&硬件】关机中断的具体实现 【汇编&硬件】网络连接相关中断的具体实现 faryou的博客-年初小记 【汇编&硬件】鼠标控制中断的具体实现 【汇编&硬件】声音输出中断的具体实现 【汇编&硬件】屏幕输出中断的具体实现 【汇编&硬件】磁盘读取中断的具体实现 【汇编&硬件】键盘读取中断的具体实现 【汇编】汇编环境的搭建及Debug的使用教程 【汇编】漫谈:学习汇编后的一些思考 faryou的博客-关于本站即日起实行“一站三体”运营制度 【汇编基础教程】完结篇 写在最后:前言 【汇编基础教程】使用BIOS的中断实现键盘输入及磁盘I/O 【汇编基础教程】中断 【汇编基础教程】端口 【汇编基础教程】标志寄存器 【汇编基础教程】再谈栈 【汇编基础教程】段 【汇编基础教程】来存一些数据! 【汇编基础教程】寄存器和内存&一些基本命令的说明 【汇编基础教程】来写个“函数” 【汇编基础教程】更灵活的定位内存 【汇编基础教程】理解一下[bx]和loop指令 【汇编基础教程】跳一跳! faryou的博客-我的竞赛经历&对人生的一些思考 faryou的博客-关于现在中小学计算机课的一些想法及思考 faryou的博客-2025年度总结 faryou的博客-临平山下十五年 faryou的博客-Windows 10即将停止支持,谈谈自己从小到大用电脑的感受 faryou的博客-谈谈一名10后的怀旧情怀 【汇编基础教程】8086CPU工作原理 【C语言】指针的理解与应用 【算法教程】【C/C++】DP(动态规划):区间DP——程序设计思路与代码实现 【算法教程】【C/C++】BFS(广度优先搜索)——程序设计思路与代码实现 【算法教程】【C/C++】DFS(深度优先搜索)——程序设计思路与代码实现 【算法教程】【C/C++】单源最短路径——程序设计思路与代码实现 【算法教程】【C/C++】最小生成树——程序设计思路与代码实现 【算法教程】【C/C++】并查集——程序设计思路与代码实现 【算法教程】【C/C++】DP(动态规划):背包DP——程序设计思路与代码实现 【算法教程】【C/C++】递推——程序设计思路与代码实现 【算法教程】【C/C++】三分算法——程序设计思路与代码实现 【算法教程】【C/C++】二分答案——程序设计思路与代码实现 【算法教程】【C/C++】二分查找——程序设计思路与代码实现 【算法教程】【C/C++】贪心算法——程序设计思路与代码实现 【算法教程】【C/C++】基础数学:快排——程序设计思路与代码实现 【算法教程】【C/C++】基础数学:快速幂——程序设计思路与代码实现 【算法教程】【C/C++】基础数学:进制转换——程序设计思路与代码实现 一文弄懂C++中的自定义函数 faryou的博客-2024年度总结
【算法教程】【C/C++】DP(动态规划):简单动规问题——程序设计思路与代码实现
作者: faryou · 2024-08-10 · via faryou的博客

前言
上一篇文章中介绍了递推,其实也是为今天的DP打好基础。

程序设计思路
DP本质上就是对题目进行分类讨论,列出其不同情况下的状态转移方程,然后套上循环求解。
DP的种类有很多,其应用范围几乎涵盖了全部的算法内容,理论上来说,只要你有能力列出状态转移方程,DP可以解决几乎一切问题。今天我们讲一下简单的DP,了解一下DP的思路。

代码实现
由于DP的可拓展性太强,今天我破例用两道题进行讲解:
202408221724319442758119.png
这道题要求我们得到最大的和。这里有一个思路:每次将金字塔底部相邻的两个数相比较,将大者加到这两个数正上方的数上。即:fx=max(fx,fx+1)+fx(金字塔存储为直角三角形)。下面是代码:

#include <bits/stdc++.h>
int r,f[1005][1005];//r如题意,f为DP用数组
int main(){
    scanf("%d",&r);
    for(int i=0;i<r;i++) for(int j=0;j<i+1;j++) scanf("%d",&f[i][j]);//读入数据
    for(int i=r-1;i>0;i--) for(int j=0;j<r-1;j++) f[i-1][j]+=max(f[i][j],f[i][j+1]);//递推式
    printf("%d",f[0][0]);//输出塔尖
    return 0;
}

这道题是经典动规题,我们通过层层上推求出结果。再来看下面这题:
202408221724328272181898.png
本题初看没有思路,但是细细一想,一个长度为n的上升子序列可以分为前面长度为n-1的上升子序列和后面的一个数,那么我们可以先把所有f[x]都初始化为1,之后用双层循环(双指针),将后面的大数和前面的子序列拼为一个序列。由此,我们可以列出这样的方程:f[x]=max(f[i],f[j-1])(f[x]表示从第1到第x个数的最长上升子序列长度),下面是代码:

#include <bits/stdc++.h>
int n,ans=0,a[5005]={0},f[5005]={0};
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        f[i]=1;
    }//以上为读入+初始化(一个数自己也算最长上升子序列)
    for(int i=1;i<=n;i++) for(int j=1;j<=i-1;j++) if(a[i]>a[j]) f[i]=max(f[i],f[j]+1);//递推式,当找到一个更大的数时,将其加入前面的子序列
    for(int i=1;i<=n;i++) ans=max(ans,f[i]);//拿到最长长度
    printf("%d",ans);//输出
    return 0;
}

结语
其实DP本身的思路不难,关键在于你能不能找出所有情况。下篇文章,我将介绍背包DP。我是faryou,再见!