dp入门30题
前言:本文章主要记录一些 入门题,都是我做过的,希望读者能从这些基础题中打好 扎实的基础,有不足的地方也欢迎指出。大部分是 和 的题(可以公开代码)。
T1:
CF191A
题意:
给你若干字符串,
举个栗子:设
问这样拼出来得到的字符串第一个字母和最后一个字母相同的字符串的最大长度。
分析:
状态表示:
不难看出,答案就是
显然,转移只跟字符串长度,开头元素,末尾元素有关。
则可以写出状态转移方程:
这里枚举转移的起点
时间复杂度
Code
T2:
CF455A
题意:
给你一个序列
分析:
状态表示:
正序枚举,然后这样就不需要考虑删除
转移:
在删与不删中取最大值。
答案:
不开
Code
T3
CF1061C
题意:
给定一个序列
分析:
状态表示:
直接转移
当
总的来说就是:
时间复杂度
然后就欢乐的
不难发现,前一维可以用滚动数组优化。
然后又不难发现,
很容易发现,只有
因此枚举
总的来说,就是
时间复杂度
Code
T4
luogu p2289
题意:
有
分析:
状态表示:
状态转移:
把挤奶时间按左端点最小排序,可以直接转移。
枚举第
答案:
时间复杂度
Code
// QwQ
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1e3+5;
struct pos
{
int l,r,s;
friend bool operator < (pos a,pos b)
{
return a.r<b.r;
}
}e[N];
int n,m,r,dp[N];
int main()
{
scanf("%d %d %d",&n,&m,&r);
for(int i=1;i<=m;i++) scanf("%d %d %d",&e[i].l,&e[i].r,&e[i].s);
sort(e+1,e+1+m);
e[0].r=-1e6;
for(int i=1;i<=m;i++)
for(int j=0;j<i;j++)
if(e[i].l-e[j].r>=r)
dp[i]=max(dp[i],dp[j]+e[i].s);
int ret=0;
for(int i=1;i<=m;i++) ret=max(ret,dp[i]);
printf("%d\n",ret);
return (0-0); // QwQ
}
T5
ABC265E
题意:
你最初在
分析:
容易发现,路径只与
状态表示:
状态转移:
答案:
时间复杂度
Code
T6
CF414B
题意:
一个数列,后一个数能被前面整除,这个数列就叫做好数列,给定
分析:
状态表示:
状态转移:
答案:
时间复杂度
Code
T7
luogu p4310
题意:
给定长度为
分析:
不难发现,
状态表示:
答案:
状态转移:
时间复杂度
Code
// QwQ
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <numeric>
using namespace std;
#define fi first
#define se second
typedef pair<int,int> PII;
typedef long long LL;
template <typename T> void inline read(T& x)
{
x=0; int f=1; char ch;
while((ch=getchar())>'9' || ch<'0') if(ch=='-') f=-1;
while(ch>='0' && ch<='9') x=x*10+(ch^'0'),ch=getchar();
x*=f;
}
int n,dp[35];
int main()
{
read(n);
for(int i=1;i<=n;i++)
{
int x,k=1; read(x);
for(int j=0;j<=30;j++) if(x>>j&1) k=max(k,dp[j]+1);
for(int j=0;j<=30;j++) if(x>>j&1) dp[j]=max(dp[j],k);
}
printf("%d\n",*max_element(dp,dp+31));
return (0-0); // QwQ
}
T8
CF580D
题意:
有
分析:
状态设计:
答案:
状态转移:
时间复杂度
Code
T9
CF1110D
题意:
有
分析:
首先,可以肯定是,一定在值域
设
然后发现不能统计
那就加一维
这个可以由
再加一维:
由于三个
那么
因此得到状态转移:
枚举
答案:$\sum\limits_{j=0}{2}\sum\limits_{k=0}dp_{m,j,k} $
时间复杂度
Code
特别感谢,wjr
大神的教导。
T10
CF2B
题意:
有一个
每次只能向下或向右走,不能走出矩阵。
分析:
一些数要乘积末尾有
因此第一问只需要求从起点到终点经过的质因子
对于第二问,基于第一问,从后向前倒推,找到这个状态转移的上一个状态,递归下去。
对于第一问的状态表示:
状态转移:
注:此题矩阵中的元素非负,当有
时间复杂度
Code
T11
CF4D
题意:
给定序列
分析:
首先可以把
然后按
状态表示:
状态转移:
第一问答案:
第二问答案:最大的
Code
T12
CF1096D
题意:
给定一个字符串
分析:
题目要求子序列不能出现字符串
状态定义:
答案:
状态转移:考虑一个字符
具体点:
Code
T13
ABC267D
题意:
给定一个序列
分析:
可能会有一个错误的贪心,只选正数,这是不对的,比如
状态表示:
答案:
状态转移:
分别表示将序列
比较裸,时间复杂度
Code
T14
ABC267G
题意:
给定序列长度为
分析:
一个很显然的状态设计:
答案:
故有方程:
Code
T15
CF1207C
题意:
城市里正在修轨道和支柱,分别花费
分析:
贪心方面想,在通车阶段一定是要贡献
状态表示:
答案:
状态转移:
对于通车段,只能从高度为
时间复杂度
Code
T16
CF1625C
题意:
有两座城市
现在可以移去其中至多
分析:
这种题,看完第一想到的肯定是
状态表示:
状态转移:
解释一下,很显然,枚举连续去掉了多少个标识(
易错:最后一个标识位置可能不为
答案:
时间复杂度
Code
T17
CF1105C
题意:
你需要构造长度为
分析:
由于序列元素总和为
因此可得状态表示:
答案:
这里需要记录
状态转移:
其实可以通过一些运算循环简化,但是这样写更易懂。
Code
T18
CF1743C
题意:
给定一个长度为
分析:
此题可以贪心,但既然是
发现这个题只有两种状态,第
因此有状态表示:
状态转移:
答案:
时间复杂度
Code
T19
CF118D
题意:
给定一个
输出答案对
分析:
应该是比较显然的状态表示:
答案:
状态转移:
Code
T20
CF467C
题意:
给定一个长度为
分析:
状态表示:
答案:
状态转移:
Code
T21
CF706C
题意:
给定若干字符串,可以选择若干字符串,将他们翻转,花费为
分析:
不难发现,每个字符串是否需要翻转,只与上一个字符串有关,那么状态表示:
记
状态转移:
答案:
时间复杂度
Code
T22
CF431C
题意:
有一棵满
答案对
分析:
因为题目只要求至少一条边大于等于
因此转换状态表示:
状态转移:
答案:
Code
T23
CF607A
题意:
有
你现在可以在第
分析:
这题我想了好久,但还是摆了。
本题有个很显然的暴力,枚举最右边被摧毁的激光塔个数,再模拟一遍可以得出答案。
但复杂度是
状态表示:
为了方便,我们记
方程:
答案:
Code
T24
CF1475G
题意:
给定
分析:
因为贪心无法维护,所以使用动态规划。
状态表示:
则有方程:
答案就是
Code
T25
CF1249E
题意:
给定
分析:
状态机模板。
状态表示:
状态转移:
初始化
第
Code
T26
CFABC275E
题意:
给定
答案对
分析:
考虑
然后很容易发现,每次投骰子,每一面都有
设
枚举投的次数
初始化
答案
时间复杂度
Code
T27
CF1324E
题意:
一天有
分析:
每次睡觉有两种选择,当要睡觉时,并不知道当前睡觉时间,但却只与上次睡觉开始时间,时长有关,具有无后效行,考虑
状态表示:
状态转移:
答案:
Code
T28
CF163A
题意:
给定字符串
答案对
分析:
直接设状态,感觉不好分析出状态,类比最长公共子序列。
状态表示:
转移方程:
答案:
Code
T29
CF106C
题意:
有
当做没有馅料的面包,需要
现在你需要求出在面团和馅料都够的情况下。能改卖的最大价值。
分析:
此题应该用背包解决。
状态表示:
答案:
分别枚举
状态转移:
Code
T30
CF1051D
题意:
有一个
答案对
分析:
考虑到这是个
因此有方程
答案:
我这里设块的状态为:
转移也比较明显:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战