算法基础精选题单 动态规划(dp)(递推+线性dp)(个人题解)

前言:

  一些简单的dp问题。

正文:

题单:237题】算法基础精选题单_ACM竞赛_ACM/CSP/ICPC/CCPC/比赛经验/题解/资讯_牛客竞赛OJ_牛客网 (nowcoder.com)

递推:

NC235911 走楼梯:

#include<bits/stdc++.h>
using namespace std;
long long dp[150];
int main(){int n;cin>>n;dp[1]=1;dp[0]=1;for(int i=2;i<=n;i++){dp[i]=dp[i-1]+dp[i-2];}cout<<dp[n];return 0;
}

dp中最经典的问题,就不展开说了。

线性dp:

NC22096 数字三角形:

#include<bits/stdc++.h>
using namespace std;
int main(){int n;while(cin>>n){for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){cout<<j<<" ";}cout<<endl;}}return 0;
} 

这题不知道和dp有什么关系,直接两层循环输出就行了。

NC16708 过河卒:

#include<bits/stdc++.h>
using namespace std;
long long dp[55][55];
void con(int x,int y){dp[x][y]=-1;if(x+1>=0&&y+2>=0)dp[x+2][y+1]=-1;if(x+2>=0&&y+1>=0)dp[x+1][y+2]=-1;if(x+2>=0&&y+1>=0)dp[x-1][y+2]=-1;if(x-2>=0&&y+1>=0)dp[x-2][y+1]=-1;if(x-2>=0&&y-1>=0)dp[x-2][y-1]=-1;if(x-1>=0&&y-2>=0)dp[x-1][y-2]=-1;if(x+1>=0&&y-2>=0)dp[x+1][y-2]=-1;if(x+2>=0&&y-1>=0)dp[x+2][y-1]=-1;
}
int main(){int n,m,x,y;cin>>n>>m>>x>>y;con(x+1,y+1);dp[1][1]=1;for(int i=1;i<=21;i++){for(int j=1;j<=21;j++){if(dp[i][j]!=-1){if(dp[i-1][j]!=-1)dp[i][j]+=dp[i-1][j];if(dp[i][j-1]!=-1)dp[i][j]+=dp[i][j-1];}}}cout<<dp[n+1][m+1];return 0;
} 

在地图上标记好马的位置与马能走到的另外八个位置,在状态转移的时候记得注意该点状态永远为0。最后输出终点的状态。

NC16619 传球游戏:

#include<bits/stdc++.h>
using namespace std;
int n,m;
long long dp[105][105];
int main(){cin>>n>>m;dp[0][1]=1;for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(j==1){dp[i][j]=dp[i-1][n]+dp[i-1][j+1];}else if(j==n){dp[i][j]=dp[i-1][1]+dp[i-1][j-1];}else{dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1];}}}cout<<dp[m][1];return 0;
}

dp[i][j]表示在传球次数达到i次时球到达j手上的方法数,状态转移方程我们可以由球只能从左右两侧传来,所以知方程dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1],注意特判j=1和n的情况。

NC16810 [NOIP1999]拦截导弹:

#include <bits/stdc++.h>
using namespace std;
int a[1001],dp[1001];
int main()
{int p=0,flag=0;while(cin>>a[++p]){}p--;int ans=0;for(int i=1;i<=p;i++){ flag=0;for(int j=i-1;j>=1;j--)if (a[i]<=a[j]) flag=max(flag,dp[j]);if (flag==0) dp[i]=1;else dp[i]=flag+1;ans=max(ans,dp[i]);//cout<<dp[i]<<endl;}cout<<ans<<endl;memset(dp,0,sizeof(dp));ans=0;for(int i=1;i<=p;i++){ flag=0;for(int j=i-1;j>=1;j--)if (a[i]>a[j]) flag=max(flag,dp[j]);if (flag==0) dp[i]=1;else dp[i]=flag+1;ans=max(ans,dp[i]);//cout<<dp[i]<<endl;}cout<<ans<<endl;return 0;
}

Dilworth定理:最小链覆盖=最长反链长度,所以需要的系统就为这个序列的最长上升列长度,而一个系统最多能拦截的值就为反转的数列的最长上升子序列长度。求两个最长上升子序列即可。

NC16664 [NOIP2004]合唱队形:

#include<bits/stdc++.h>
using namespace std;
int a[1005];int dp1[1005],dp2[1005];
int main(){int n,ans=0;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}dp1[1]=1;for(int i=1;i<=n;i++){int m=0;for(int j=1;j<i;j++){if(a[i]>a[j]&&dp1[j]>m)m=dp1[j];//cout<<dp1[i]<<endl;}dp1[i]=m+1;}dp2[n]=1;for(int i=n;i;i--){int m=0;for(int j=n;j>i;j--){if(a[i]>a[j]&&dp2[j]>m)m=dp2[j];}dp2[i]=m+1;}for(int i=1;i<=n;i++){ans=max(ans,dp1[i]+dp2[i]-1);}//cout<<n<<" "<<ans<<endl;cout<<n-ans<<endl;return 0;
}

最长上升子序列的变式。先从左往右求一遍最长上升子序列(dp1),再从右往左求一遍(dp2)。
结果遍历一遍从左和从右的dp值和(dp1[i]+dp2[i]),找出和为最大的即为最大正常先递增再递减的子序列长度。

NC235954 滑雪:

#include<bits/stdc++.h>
using namespace std;
const int N = 310;
int n, m;
int g[N][N];
int f[N][N];
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int dp(int x, int y){int &v = f[x][y];if (v != -1) return v;v = 1;for (int i = 0; i < 4; i ++ ){int a = x + dx[i], b = y + dy[i];if (a >= 1 && a <= n && b >= 1 && b <= m && g[x][y] > g[a][b])v = max(v, dp(a, b) + 1);}return v;
}int main(){cin>>n>>m;for (int i = 1; i <= n; i ++ )for (int j = 1; j <= m; j ++ )scanf("%d", &g[i][j]);memset(f, -1, sizeof f);int res = 0;for (int i = 1; i <= n; i ++ )for (int j = 1; j <= m; j ++ )res = max(res, dp(i, j));printf("%d\n", res);return 0;
}

经典的记忆化搜索的题,我觉得比起dp更像搜索。从最高点开始向四周搜索,结束时一定是最长的路径在dp中,因为搜索结束了就表示最长的那条线已经走完了。

NC235948 最大子串和:

#include<bits/stdc++.h>
using namespace std;
long long a[1000005],dp[1000005];
int main(){long long n,ans=0;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];dp[i]=max(dp[i-1]+a[i],dp[i]);ans=max(ans,dp[i]);}cout<<ans;return 0;
}

从某一个数字来看,它的最大连续子串和是前面一个数字的最大连续子串和加上它本身,和他本身取较大的那一个。当位于第一个的时候自然就是他自身所以可以实现一个动态规划。故递推式:dp[i] = max(dp[i-1]+dp[i], dp[i])。

NC235624 牛可乐和最长公共子序列:

#include<bits/stdc++.h>
using namespace std;
int dp[5005][5005];
int main(){string s,t;while(cin>>s>>t){if(s[0]==t[0])dp[1][1]=1;int ans=0;//memset(dp,0,sizeof(dp));int n=s.size(),m=t.size();for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(s[i-1]==t[j-1])dp[i][j]=dp[i-1][j-1]+1;else dp[i][j]=max(dp[i][j-1],dp[i-1][j]);ans=max(dp[i][j],ans);}}cout<<ans<<endl;}return 0;
}

最长上升子序列的模板题。

后记:

  刷题的日子才过去两天怎么感觉我现在已经有点萎了,果然坚持下去是一件非常难的事啊。加油吧!

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

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

相关文章

linux 关闭防火墙

文章目录 关闭系统防火墙关闭 linux 防火墙 关闭系统防火墙 systemctl stop firewalld systemctl disable firewalld // 关闭开机自启动 systemctl status firewalld // 查看防火墙状态关闭 linux 防火墙 setenforce 0 getenforce // 查看状态 vim /etc/sysconfig/selinux //…

USB2.0学习4--USB包结构和包类型

目录 1. USB包基本结构 1.1 SOP域&#xff08;Start Of Packet&#xff09; 1.2 SYNC域&#xff08;同步域&#xff09; 1.3 PID域&#xff08;标识域&#xff09; 1.4 地址域&#xff08;ADDR&#xff09; 1.5 帧号域&#xff08;Fram&#xff09; 1.6 数据域&#xff…

jeecg 框架的excel导入 含图片(嵌入式,浮动式)

jeecg 框架的excel导入 含图片&#xff08;嵌入式&#xff0c;浮动式&#xff09; 一、啰嗦二、准备三、 代码1、代码&#xff08;修改覆写的ExcelImportServer&#xff09;2、代码&#xff08;修改覆写的PoiPublicUtil&#xff09;3、代码&#xff08;新增类SAXParserHandler&…

根据正则表达式查找字符串中第一次出现的一个或多个连续数字并返回起止位置re.rearch

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 根据正则表达式 查找字符串中 第一次出现的 一个或多个连续数字 并返回起止位置 re.rearch [太阳]选择题 根据给定的Python代码&#xff0c;哪个选项是正确的&#xff1f; import re patte…

基于Java图书馆管理系统详细设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

“明天下班以后请假了,孩子中考“

「作者简介」&#xff1a;冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础著作 《网络安全自学教程》&#xff0c;适合基础薄弱的同学系统化的学习网络安全&#xff0c;用最短的时间掌握最核心的技术。 前几天约服务器…

让在制品管理更有效

徐总的工厂生产线非常繁忙&#xff0c;每天都在不停地运转。但在制品的流转和存储也非常混乱&#xff0c;导致了很多问题的出现。 一方面&#xff0c;由于缺乏有效的管理&#xff0c;在制品的库存不断增加&#xff0c;占用了大量的资金和空间资源。这些库存不仅增加了库存成本&…

几何内核开发-实现自己的NURBS曲线生成API

我去年有一篇帖子&#xff0c;介绍了NURBS曲线生成与显示的实现代码。 https://blog.csdn.net/stonewu/article/details/133387469?spm1001.2014.3001.5501文章浏览阅读323次&#xff0c;点赞4次&#xff0c;收藏2次。搞3D几何内核算法研究&#xff0c;必须学习NURBS样条曲线…

Java医院绩效考核系统源码:关于医院绩效考核系统的技术架构、系统功能、如何选择医院绩效考核管理系统

Java医院绩效考核系统源码&#xff1a;关于医院绩效考核系统的技术架构、系统功能、如何选择医院绩效考核管理系统 随着医疗技术的不断发展&#xff0c;医院绩效管理系统已经成为提升医疗服务质量和效率的关键技术之一。本文将介绍医院绩效管理系统的概念、开发环境、功能应用…

三维点云目标识别对抗攻击研究综述

源自&#xff1a;电子与信息学报 作者&#xff1a;刘伟权 郑世均 郭宇 王程 注&#xff1a;若出现无法显示完全的情况&#xff0c;可 V 搜索“人工智能技术与咨询”查看完整文章 摘 要 当前&#xff0c;人工智能系统在诸多领域都取得了巨大的成功&#xff0c;其中深度学…

Tailwindcss 提取组件

背景 随着项目的发展&#xff0c;您不可避免地会发现自己需要重复使用常用样式&#xff0c;以便在许多不同的地方重新创建相同的组件。这在小组件&#xff08;如按钮、表单元素、徽章等&#xff09;中最为明显。在我的项目中是图表标题样式如下&#xff1a; <div class&qu…

TensorFlow高阶API使用与PyTorch的安装

欢迎来到 Papicatch的博客 文章目录 &#x1f349;TensorFlow高阶API使用 &#x1f348;示例1&#xff1a;使用tf.keras构建模型 &#x1f34d;通过“序贯式”方法构建模型 &#x1f34d;通过“函数式”方法构建模型 &#x1f348;示例2&#xff1a;编译模型关键代码 &am…

新手(初学者)学R语言第一课,从学正确导入数据开始

初看题目好像我在教你怎么导入数据&#xff0c;不不不&#xff0c;我是在教你正确的导入数据&#xff0c;不是说数据导入R就叫正确导入数据了。本章为新手教程&#xff0c;老手可以跳过。 这个内容早就想写了&#xff0c;今天有点空和大家聊一下。为什么R语言对于新手而言不太友…

建议收藏!100款宝藏级AIGC工具分享,70款ChatGPT插件惊艳的开发过程与宏大的商业化愿景

建议收藏&#xff01;100款宝藏级AIGC工具分享&#xff0c;70款ChatGPT插件惊艳的开发过程与宏大的商业化愿景。 不输ChatGPT&#xff1f;整理了100款AIGC神器&#xff0c;打工人速进。 说到AIGC工具&#xff0c;你还是只知道ChatGPT&#xff1f; 实际上&#xff0c;越来越多…

【机器学习】自然语言处理的新前沿:GPT-4与Beyond

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 &#x1f525;引言 背景介绍 文章目的 一、GPT-4简介 GPT-4概述 主要特性 局限性和挑战 二、自监督学习的新进展 自监督学习的原理 代表性模型和技术 三、少样本学习和零样本学习 少样本学习的挑战 先…

使用kibana创建索引的时候报错处理

报错信息&#xff1a;The index pattern youve entered doesnt match any indices. You can match your 1 index, below. 使用kibana创建索引的时候&#xff0c;无法进行下一步创建操作&#xff0c;出现这种情况有很多种情况&#xff0c;每个人遇到的问题会不一样。 第一种&am…

Linux系统本地部署Android模拟器并实现无公网IP远程访问开发测试

文章目录 前言1. 虚拟化环境检查2. Android 模拟器部署3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问小结 6. 固定Cpolar公网地址7. 固定地址访问 前言 本文主要介绍如何在Linux Ubuntu系统使用Docker部署docker-android安卓模拟器&#xff0c;并结合cpolar内网穿透工具实现…

已成功见刊检索的国际学术会议论文海报展示(2)

【先投稿先送审】第四届计算机、物联网与控制工程国际学术会议&#xff08;CITCE 2024) 大会官网&#xff1a;www.citce.org 时间地点&#xff1a;2024年11月1-3日&#xff0c;中国-武汉 收录检索&#xff1a;EI Compendex&#xff0c;Scopus 主办单位&#xff1a;四川师范…

Springboot整合阿里云ONS RocketMq(4.0 http)

1. 引入依赖 <!--阿里云ons&#xff0c;方便的接入到云服务--> <dependency><groupId>com.aliyun.openservices</groupId><artifactId>ons-client</artifactId><version>1.8.4.Final</version> </dependency>2. 配置 配…

项目五 OpenStack镜像管理与制作

任务一 理解OpenStack镜像服务 1.1 •什么是镜像 • 镜像通常是指一系列文件或一个磁盘驱动器的精确副本。 • 虚拟机 所使用的 虚拟磁盘 &#xff0c; 实际上是 一种 特殊格式的镜像文件 。 • 云 环境下尤其需要 镜像。 • 镜像 就是一个模板&#xff0c;类似于 VMware 的虚…