动态规划
穷源溯流
路很长,尽管走便是。
展开
-
Codeforces Round #704 (Div. 2) C. Maximum width(思维+DP)
给出两个字符串 s 和 t,s 中一定有一个子序列可以构成 t,假设构成 t 的子序列的下标为 ,求对于 t 的每一个字符,都可以找到 s 中最大匹配的位置和最小匹配的位置,找到之后两相邻字符之间的最大距离即为答案const int N=5e5+5; int n,m; int i,j,k; char s[N],t[N]; int l[N],r[N];int main(){ while(~sdd(n,m)){ ss(s+1); s...原创 2021-02-23 23:17:41 · 294 阅读 · 0 评论 -
洛谷 P3041 [USACO12JAN]Video Game G(AC自动机+DP)
题目不难想到要应用 DP,建好 AC自动机之后dp[i][j] 表示到第i 个字符标号为j 的节点时最大的连击数是多少dp 方程也不难想由于本人实力欠缺,dp 数组的初始化为什么要设为 -1 没想明白,先给自己挖个坑 QAQconst int N=300+5; int n,m; int i,j,k; char s[N]; int t[N][3],tot=0; int vis[N],f[N]; int dp[(int)1e3+5...原创 2021-02-22 21:20:12 · 213 阅读 · 0 评论 -
HDU 3336 Count the string(KMP+DP)
求字符串中的每一个前缀在字符串中的出现个数样例解释 :a 出现两次,ab 两次 ,aba 一次,abab 一次next[i] 不为 0,说明出现过前缀,改前缀的贡献会在出现一次,所以 dp[i]=dp[next[i]]+1#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#define rush() int T;c...原创 2021-02-05 11:03:19 · 220 阅读 · 0 评论 -
洛谷 P3097 [USACO13DEC]Optimal Milking G(线段树+dp)
题目中的修改为基本操作,但是究竟要维护什么,值得我们去讨论其实很容易想到左端点到底要不要,如果左端点要是一种情况,左端点不要有是一种情况当选择左端点时,最优的时候是不是将奇数位置上的所有点都取,还是说中间要变,这便是我们熟悉的动态规划线段的每一个点都维护一个区间内部端点的选择情况 f[i][j] 当 i =0 时,表示左端点不取,j = 0 时,表示右端点不取这样在 push_up() 函数中应用动态规划即可const int N=4e4+5;#define int ...原创 2021-01-19 10:08:39 · 219 阅读 · 0 评论 -
Educational Codeforces Round 97 (Rated for Div. 2) C. Chef Monocarp(动态规划 + 贪心)
有一个厨师,想要将 n 盘菜从烤箱中拿出来,但是每道菜都有一个特定的时间点 a[i] 拿出来时是最好的,但是他每分钟只能拿一道菜,如果在 t 分钟时拿了第 a[i] 道菜,那么他将增加 abs(a[i]-t) 的怒气值,求厨师最小的怒气值是多少看着这个题没有任何暴力的想法,所以考虑 DPdp[i][j]: 表示在 i 时间以内,将前 j 个菜取完所需花费的最小值当第 i 时刻取 j 时,那么表示 前 i-1 的时间之内没有取第 j 盘菜 : dp[i-1][j-1]+abs(...原创 2020-10-29 09:18:44 · 654 阅读 · 0 评论 -
D - Colored Rectangles(动态规划)
给出红绿蓝三种颜色的木棍,每种长度的木棍每一次给一对,现在每次取两对木棍,组成由两种颜色组成的长方形,求最后长方形的面积之和最大是多少这样思路就很简单了,每次都从三个数组中挑选出最大的和次大的,模拟即可但是你会发现,当有一种颜色的木棍数量很多时,假设 R >B+G最优的策略还会是这样吗?有可能存在 B G 两种颜色相互组成木棍,而我们希望让所有的 B G 都与 R 组成木棍这两种决策需要再次比较大小,这样问题的复杂性就比较高了WA代码:const in...原创 2020-08-15 16:21:45 · 337 阅读 · 0 评论 -
HDU 1208 Pascal‘s Travels
有一个 n*n 的方阵,从左上角 (1,1)出发到达 (n,n) 有多少种方式每个方格中有一个数 x,到达这个方格后,你可以选择向右或向下行走 x 各单位注意若 x = 0 那么会被卡住,不允许越界const int N=50+5; int n,m,t; int i,j,k; int a[N][N]; ll dp[N][N];int main(){ //IOS; while(~sd(n)){ if(n=...原创 2020-08-14 16:27:50 · 218 阅读 · 0 评论 -
HDU 2501 Tiling_easy version
递推方程为:dp[i]=dp[i-2]*2+dp[i-1]const int N=100+5; int n,m,t; int i,j,k; int a[N]; int dp[N];int main(){ //IOS; dp[1]=1; dp[2]=3; for(i=3;i<=N;i++){ dp[i]=dp[i-2]*2+dp[i-1]; } rush(){ sd...原创 2020-08-14 16:06:47 · 204 阅读 · 0 评论 -
HDU 2524 矩形A + B
高中数学:横行选择两条直线,竖行选这两条直线即*其中 n ,m 为水平线与竖直线const int N=100+5; int n,m,t; int i,j,k; int a[N]; int dp[N][N];int main(){ //IOS; rush(){ sdd(n,m); n++,m++; pd(n*(n-1)/2*m*(m-1)/2); } //...原创 2020-08-14 14:03:36 · 167 阅读 · 0 评论 -
HDU 2512 一卡通大冒险
假设 dp[i][j] 为有 i 张卡片分给 j 个人的种类数先来看一个例子当有 3 张卡片时时,{{A},{B},{C}} , {{A,B},{C}}, {{B,C},{A}}, {{A,C},{B}} ,{{A,B,C}}我们取分给 3 个人此时加一张卡片,也就是有 4 张卡篇分给 3 个人第 4 张卡片可以在{{A,B},{C}}, {{B,C},{A}}, {{A,C},{B}} 这三个集合中插入一个新元素也可以在 {{A},{B},{C}} 内与其他字母构成...原创 2020-08-14 11:29:20 · 167 阅读 · 0 评论 -
HDU 2032 杨辉三角
const int N=100+5; int n,m,t; int i,j,k; int a[N]; int dp[N][N];int main(){ //IOS; dp[1][1]=1; dp[2][1]=dp[2][2]=1; for(i=3;i<=30;i++){ dp[i][1]=dp[i][i]=1; for(j=2;j<=i-1;j++){ dp[...原创 2020-08-13 22:18:53 · 176 阅读 · 0 评论 -
HDU 1087 Super Jumping! Jumping! Jumping!
最大上升子序列:有 n 个数,每次取的数都必须比前一个取的数大dp[i] 为以 i 结尾的最大上升子序列由 max(dp[j] )转移过来,因为 dp[j] 以 a[j] 结尾,所以只要判断 a[i]>a[j] 即可当然别忘了初始化const int N=1000+5; int n,m,t; int i,j,k; int a[N]; int dp[N];int main(){ //IOS; while(~sd(n)...原创 2020-08-13 16:25:01 · 278 阅读 · 0 评论 -
HDU 1466 计算直线的交点数
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;bool dp[22][222];void goto_dp(){ for(int i=0;i<22;i++) dp[i][0]=1; for(int i=2;i<22;i++)//枚举线的条数 for(in.原创 2020-08-13 16:02:00 · 289 阅读 · 0 评论 -
POJ 3176 Cow Bowling
有一个金字塔,一颗球只能滚到他的下面左边的那一个或右边的那一个,问经过的最大数值总和是多少经典 DP:dp[i][j] 表示到达第 i 层的第 j 个数字后的最大总和dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+a[i][j]const int N=350+5; int n,m,t; int i,j,k; int a[N][N]; int dp[N][N]; int main(){ //IO...原创 2020-08-12 22:21:01 · 116 阅读 · 0 评论 -
HDU 1300 Pearls(前缀和+DP)
#include<stdio.h>#define min(x,y) (x<y?x:y)int main(){ int dp[105],num[105],sum[105],pri[105],i,j,k,t,m,n; scanf("%d",&m); while(m!=0) { scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d%d",&am.原创 2020-08-11 22:07:31 · 208 阅读 · 1 评论 -
D - Rarity and New Dress(二维 DP)
题目大概是从 n*m 的图中,找出菱形,菱形的形状由相同字母组成的题目中 涂绿 的形状首先想到的就是递推,以 ch[i][j]=‘a’ 为例:以 [i][j] 为中心向上向下走,直到遇到不为 ‘a’ 的字符在以 [i][j] 为中心向左向右走,直到遇到不为 'a' 的字符取最小值作为以 ch[i][j] 为中心的贡献值dp[i][j]=min(l[i][j],r[i][j],u[i][j],d[i][j])dp[i][j]:以 ch[i][j] 为中心的贡献值...原创 2020-08-08 16:12:21 · 358 阅读 · 0 评论 -
P1725 琪露诺(DP+单调队列)
首先这个题肯定应用动态规划根据题意,方程为 dp[i]=max(dp[i],dp[j]+a[i]) (j+[l,r]=i)然后答案分布在 dp[i] i ∈[n+1,n+r] 之间好了,这个题就解决了时间复杂度最坏为: O(N*(R-l)),即 O(N^2)超时肯定的了超时代码:const int N=5e5+5; int n,m,t; int i,j,k; int dp[N]; int a[N];int main(){ ..原创 2020-07-29 11:38:37 · 269 阅读 · 0 评论 -
C. Two Arrays(DP)
由题意我们很容易想到要构造一个长度为 m*2 的序列满足单调递增或单调递减在这里我构造了一个单调递增的序列,即 a[1]a[2]……a[m]b[1]b[2]……b[m]制约一个序列的是他的起始位置和终止位置,我们可以确定终止位置及长度来代替进行动态规划dp[i][j] 为长度为 i ,并以 j 为结尾的序列有多少个则动态方程为 dp[i][j]=,这样复杂度接近O(N^2*m) for(i=2;i<=m;i++){ for(j=1;...原创 2020-07-07 08:09:31 · 302 阅读 · 0 评论 -
1572:括号配对
const int N=400+5; int n,m,t; int i,j,k; //int a[N]; char ch[N]; int dp[N][N]; int main(){ IOS; while(cin>>ch+1){ n=strlen(ch+1); for(int len=2;len<=n;len++){ for(int i=1;i+len-1&l...原创 2020-06-30 17:13:20 · 479 阅读 · 0 评论 -
1570:能量项链
【题目描述】题做多了总会遇到重复的:原博客点击这里const int N=400+5; int n,m,t; int i,j,k; int a[N]; int head[N],tail[N]; int dp[N][N]; int main(){ IOS; while(cin>>n){ for(i=1;i<=n;i++) cin>>head[i],head[i+n]=head[i.原创 2020-06-30 16:58:10 · 414 阅读 · 0 评论 -
1569:石子合并
方程:dp[i][j]=dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]环形 dp 模板题const int N=400+5; int n,m,t; int i,j,k; int a[N]; int sum[N],dp_max[N][N],dp_min[N][N]; int main(){ IOS; while(cin>>n){ for(i=1;i<=n;i++){ ...原创 2020-06-30 16:40:12 · 576 阅读 · 0 评论 -
1279:橱窗布置(flower)
//Created on 2020/2/22#include <iostream>#include <bits/stdc++.h>using namespace std;typedef long long ll;const int inf=0x3f3f3f3f;const int idata=500+5;int dp[idata][idata];in...原创 2020-06-25 22:25:49 · 669 阅读 · 0 评论 -
C. Sweets Eating(思维+dp+贪心)
Tsumugi broughtnndelicious sweets to the Light Music Club. They are numbered from11tonn, where theii-th sweet has a sugar concentration described by an integeraiai.Yui loves sweets, but she can eat at mostmmsweets each day for health reasons.D...原创 2020-06-11 14:08:37 · 410 阅读 · 0 评论 -
P1359 租用游艇
题目描述长江游艇俱乐部在长江上设置了n 个游艇出租站1,2,…,n。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i 到游艇出租站j 之间的租金为r(i,j),1<=i<=j<=n。试设计一个算法,计算出从游艇出租站1 到游艇出租站n 所需的最少租金。对于给定的游艇出租站i 到游艇出租站j 之间的租金为r(i,j),1<=i<...原创 2020-06-25 22:30:07 · 248 阅读 · 0 评论 -
P1569 Generic Cow Protests
题目描述约翰家的 nnn 头奶牛聚集在一起,排成一列,正在进行一项抗议活动。第 iii 头奶牛的理智度为 aia_iai。约翰希望奶牛在抗议时保持理性,为此,他打算将所有的奶牛隔离成若干个小组,每个小组内的奶牛的理智度总和都要不小于零。由于奶牛是按直线排列的,所以一个小组内的奶牛位置必须是连续的。请帮助约翰计算一下,最多分成几组。输入格式第一行一个正整数 nnn,表示牛的数...原创 2020-03-14 17:21:06 · 362 阅读 · 0 评论 -
P3009 [USACO11JAN]Profits S
题目描述The cows have opened a new business, and Farmer John wants to see how well they are doing. The business has been running for N (1 <= N <= 100,000) days, and every day i the cows recorde...原创 2020-03-14 15:33:22 · 361 阅读 · 0 评论 -
[SCOI2008]配对
https://nanti.jisuanke.com/t/T2669#include <iostream>#include <algorithm>#include <cstring>#include <bits/stdc++.h>using namespace std;typedef long long ll;const int...原创 2020-03-02 10:31:59 · 174 阅读 · 0 评论 -
P1115 最大子段和
题目描述给出一段序列,选出其中连续且非空的一段使得这段和最大。输入格式第一行是一个正整数N,表示了序列的长度。第二行包含N个绝对值不大于10000的整数Ai,描述了这段序列。输出格式一个整数,为最大的子段和是多少。子段的最小长度为111。输入输出样例输入 #172 -4 3 -1 2 -4 3输出 #14说明/提示【样例说明】...原创 2020-03-01 10:28:31 · 361 阅读 · 0 评论 -
Mashmokh and ACM
In the first sample the good sequences are: [1, 1], [2, 2], [3, 3], [1, 2], [1, 3].在一个长度等于m的数组中后一个元素必须大于等于前一个元素,而且后一位元素一定能被前一位整除#include <iostream>#include <cstdio>#include <cst...原创 2020-02-25 21:51:45 · 302 阅读 · 0 评论 -
1302:股票买卖
【题目描述】最近越来越多的人都投身股市,阿福也有点心动了。谨记着“股市有风险,入市需谨慎”,阿福决定先来研究一下简化版的股票买卖问题。假设阿福已经准确预测出了某只股票在未来N天的价格,他希望买卖两次,使得获得的利润最高。为了计算简单起见,利润的计算方式为卖出的价格减去买入的价格。同一天可以进行多次买卖。但是在第一次买入之后,必须要先卖出,然后才可以第二次买入。现在,阿福想知道...原创 2020-02-23 21:15:54 · 860 阅读 · 0 评论 -
1278:复制书稿(book)
【题目描述】现在要把m本有顺序的书分给k个人复制(抄写),每一个人的抄写速度都一样,一本书不允许给两个(或以上)的人抄写,分给每一个人的书,必须是连续的,比如不能把第一、第三和第四本书给同一个人抄写。现在请你设计一种方案,使得复制时间最短。复制时间为抄写页数最多的人用去的时间。【输入】第一行两个整数m,k;(k≤m≤500)第二行m个整数,第i个整数表示第i本书的页数。...原创 2020-02-23 20:25:48 · 757 阅读 · 0 评论 -
1301:大盗阿福
【题目描述】阿福是一名经验丰富的大盗。趁着月黑风高,阿福打算今晚洗劫一条街上的店铺。这条街上一共有 N家店铺,每家店中都有一些现金。阿福事先调查得知,只有当他同时洗劫了两家相邻的店铺时,街上的报警系统才会启动,然后警察就会蜂拥而至。作为一向谨慎作案的大盗,阿福不愿意冒着被警察追捕的风险行窃。他想知道,在不惊动警察的情况下,他今晚最多可以得到多少现金?【输入】输入的第一...原创 2020-02-23 15:35:54 · 1039 阅读 · 0 评论 -
1275:乘积最大
【题目描述】今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加。活动中,主持人给所有参加活动的选手出了这样一道题目:设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积最大。同时,为...原创 2020-02-23 08:27:15 · 741 阅读 · 0 评论 -
1305:Maximum sum
【题目描述】对于给定的整数序列A={a1,a2,...,an},找出两个不重合连续子段,使得两子段中所有数字的和最大。我们如下定义函数 d(A):d(A)=max1≤s1≤t1≤s2≤t2≤n{∑i=s1t1ai+∑j=s2t2aj}我们的目标就是求出d(A)。【输入】第一行是一个整数T(≤30),代表一共有多少组数据。接下来是T组数据。每组数据的第一行是一个整数,代表数...原创 2020-02-22 22:27:21 · 995 阅读 · 0 评论 -
1304:数的划分
【题目描述】将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。例如:n=7,k=3,下面三种分法被认为是相同的。1,1,5; 1,5,1; 5,1,1;问有多少种不同的分法。 输出一个整数,即不同的分法。【输入】两个整数n,k(6<n≤200,2≤k≤6),中间用单个空格隔开。【输出】一个整数,即不同的分法。【输入样例】7 3...原创 2020-02-22 19:31:24 · 1951 阅读 · 0 评论 -
1303:鸣人的影分身
【题目描述】在火影忍者的世界里,令敌人捉摸不透是非常关键的。我们的主角漩涡鸣人所拥有的一个招数——多重影分身之术——就是一个很好的例子。影分身是由鸣人身体的查克拉能量制造的,使用的查克拉越多,制造出的影分身越强。针对不同的作战情况,鸣人可以选择制造出各种强度的影分身,有的用来佯攻,有的用来发起致命一击。那么问题来了,假设鸣人的查克拉能量为M,他影分身的个数最多为N,那么制造影...原创 2020-02-22 19:05:31 · 1057 阅读 · 0 评论 -
1300:鸡蛋的硬度
【题目描述】最近XX公司举办了一个奇怪的比赛:鸡蛋硬度之王争霸赛。参赛者是来自世界各地的母鸡,比赛的内容是看谁下的蛋最硬,更奇怪的是XX公司并不使用什么精密仪器来测量蛋的硬度,他们采用了一种最老土的办法--从高度扔鸡蛋--来测试鸡蛋的硬度,如果一次母鸡下的蛋从高楼的第a层摔下来没摔破,但是从a+1层摔下来时摔破了,那么就说这只母鸡的鸡蛋的硬度是a。你当然可以找出各种理由说明这种方法不科学...原创 2020-02-22 17:52:36 · 1176 阅读 · 1 评论 -
1298:计算字符串距离
【题目描述】对于两个不同的字符串,我们有一套操作方法来把他们变得相同,具体方法为: 修改一个字符(如把“a”替换为“b”);删除一个字符(如把“traveling”变为“travelng”)。比如对于“abcdefg”和“abcdef”两个字符串来说,我们认为可以通过增加/减少一个“g”的方式来达到目的。无论增加还是减少“g”,我们都仅仅需要一次操作。我们把这个操作所需...原创 2020-02-22 11:25:22 · 1062 阅读 · 0 评论 -
1297:公共子序列
【题目描述】我们称序列Z=<z1,z2,...,zk>是序列X=<x1,x2,...,xm>的子序列当且仅当存在严格上升的序列<i1,i2,...,ik>,使得对j=1,2,...,k,有xij=zj。比如Z=<a,b,f,c> 是X=<a,b,c,f,b,c>的子序列。现在给出两个序列X和Y,你的任务是找到X和Y的...原创 2020-02-22 11:20:45 · 1596 阅读 · 1 评论 -
1277:方格取数
【题目描述】设有N×N的方格图,我们在其中的某些方格中填入正整数,而其它的方格中则放入数字0。如下图所示:某人从图中的左上角A出发,可以向下行走,也可以向右行走,直到到达右下角的B点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。此人从A点到B点共走了两次,试找出两条这样的路径,使得取得的数字和为最大。【输入】第一行为一个整数N(N≤10),表示N...原创 2020-02-22 09:17:45 · 751 阅读 · 0 评论