随笔分类 -  算法竞赛-动态规划

摘要:题目思路:首先使用邻接矩阵存贮碱基对的相似信息,dp[i][j]表示使用字符串a中的前i个碱基、使用字符串b中的前j个碱基进行匹配的最大相似信息。 很明显dp[i][j]可由dp[i][j-1](b[j]匹配空碱基),dp[i-1][j](a[i]匹配空碱基),dp[i-1][j-1](a[i]匹配 阅读全文
posted @ 2019-05-13 09:51 声声醉如兰 阅读(237) 评论(0) 推荐(0)
摘要:题目大意: 给你两个字符串p,q,字符串中每个字符代表一个颜色,现在按顺序合并两个字符串,得到一个新字符串。新字符串的价值为,每个颜色价值的和,单个颜色价值的和等于该颜色在新字符中最后一次出现的位置减去第一次出现的位置。求最小价值 题目思路: dp[i][j]代表使用p的前i个字符,q的前j个字符合 阅读全文
posted @ 2019-05-01 16:40 声声醉如兰 阅读(146) 评论(0) 推荐(0)
摘要:动态规划的好题 状态转移很简单,dp[i] = dp[i-k] + st[i] ,k是移动距离,st[i]判断i位置是否有石头,但是距离太大,需要压缩路径。 K∈[1,10],lcm[1,10] = 2520,将石子间的距离距离对2520取模。而后进行DP递推即可 #include<stdio.h> 阅读全文
posted @ 2019-04-29 13:44 声声醉如兰 阅读(187) 评论(0) 推荐(0)
摘要:动态规划 先确认区间内的单词个数,由于对于一个单词,首字母不能重叠,所以反向寻找。pre[i][j]表示区间i,j内单词的个数,pre[i][j] = pre[i-1][j],若字符串[i,j]的字串中包含以字符i为首字母的单词,pre[i][j]++ dp[i][j]表示将长度为i的字符串划分j段 阅读全文
posted @ 2019-04-29 11:02 声声醉如兰 阅读(209) 评论(0) 推荐(0)
摘要:题目大意:若一个数以某个位置为支点,支点左右的加权和相同,这样的数被称为平衡数,求区间内平衡数的个数 思路:枚举支点位置,针对每个支点进行数位DP,但是0比较特殊,假设该数的长度为len,枚举len次支点位置,0会被重复计算len次,但我们只需要统计一次。 #include<stdio.h> #in 阅读全文
posted @ 2019-04-27 19:36 声声醉如兰 阅读(187) 评论(0) 推荐(0)
摘要:01背包:P(至少一个offer) = 1 - P(拥有全部offer) #include<stdio.h> #include<cstdio> #include<iostream> #include<algorithm> #include<math.h> #include<stdlib.h> #in 阅读全文
posted @ 2019-03-21 15:40 声声醉如兰 阅读(204) 评论(0) 推荐(0)
摘要:多重背包,很水 #include<stdio.h> #include<cstdio> #include<iostream> #include<algorithm> #include<math.h> #include<stdlib.h> #include<string.h> #include<stri 阅读全文
posted @ 2019-03-21 15:38 声声醉如兰 阅读(130) 评论(0) 推荐(0)
摘要:分组DP 阅读全文
posted @ 2019-03-21 15:37 声声醉如兰 阅读(133) 评论(0) 推荐(0)
摘要:动态规划初学者入门,本篇详细介绍了LIS问题,01背包问题,完全背包问题,多重背包问题,混合背包问题,及常见变形问题供初学者学习。建议先看第五讲LIS问题,而后学习背包问题。 阅读全文
posted @ 2018-02-01 18:18 声声醉如兰 阅读(473) 评论(0) 推荐(3)
摘要:若a[i]-i(i从1开始)的值小于0,那么a[i]必须改变 若a[i]-i的值大于等于0,将a[i]-i存入新的数组中,求出新数组的最长非严格上升子序列,所得即最多的,不用改变的数。 #include<stdio.h> #include<math.h> #include<cstring> #inc 阅读全文
posted @ 2018-01-30 09:18 声声醉如兰 阅读(251) 评论(0) 推荐(0)
摘要:很经典的动态规划,Maxsum Plus dp[i][j]表示将i个数字,分为j的段不相交子段的最大字段和,容易得到: dp[i][j] = max(dp[i-1][j],dp[k][j-1])+a[i] k∈[j-1,i] 因为数据范围过大,对其方程式进行压缩: dp[i-1][j]+a[i] 表 阅读全文
posted @ 2018-01-27 09:33 声声醉如兰 阅读(183) 评论(0) 推荐(0)
摘要:设dp[n]为整数n的分割函数,由五边形定理得到: dp[n] = dp[n-1] + dp[n-2] - dp[n-5] - dp[n-7]…… 我们将其分为两部分计算 第一部分为 :( dp[n-1] - dp[n-5] …… ) 奇数项为加,偶数项为减,第j项括号内的值为 : n-(j*(3* 阅读全文
posted @ 2017-11-12 20:37 声声醉如兰 阅读(445) 评论(0) 推荐(0)
摘要:题目思路:数位dp,若这个数能被每位的非0数整除,那么这个数一定可以被每一位数的lcm整除,lcm(1,2,3,4,5,6,7,8,9) = 2520,所以可以通过将这个数对2520取模来压缩空间,取模结果计做mod dp[pos][lcm][mod],显然20*2520*2520仍然过大,所以我们 阅读全文
posted @ 2017-11-07 17:46 声声醉如兰 阅读(191) 评论(0) 推荐(0)
摘要:题目描述: 给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数。 例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。 Input Output 阅读全文
posted @ 2017-10-25 10:05 声声醉如兰 阅读(204) 评论(0) 推荐(0)
摘要:题目大意:n个不同身高的队员和教练的按照身高排成波浪形……每个人按照身高由低到高编号,其中第m个是教练,他必须在第一个,如果条件允许,排第二的要比m低,如果条件不允许,即其余人都比教练高,则要让差距尽可能小,求排队方案数。 题目思路: dp_up[i][j],代表i个人排队,第j个人排在队首,且第二 阅读全文
posted @ 2017-10-20 10:26 声声醉如兰 阅读(165) 评论(0) 推荐(0)
摘要:题目大意:求一个序列中 先严格递增后严格递减的子序列的数目(要求这个子序列对称)。 题目思路:正一遍DP,反一遍DP,因为n<=1e5,dp要把时间压缩到nlogn #include<stdio.h> #include<string.h> #include<iostream> #include<al 阅读全文
posted @ 2017-10-19 13:40 声声醉如兰 阅读(220) 评论(0) 推荐(0)
摘要:题目大意: 求区间内的回文数个数 题目思路: 数位dp,先枚举前一半数字,然后填上相应的后一半数字。 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include< 阅读全文
posted @ 2017-10-16 14:57 声声醉如兰 阅读(242) 评论(0) 推荐(0)
摘要:题意:给你m个字符,其中有n种字符,每种字符都有两个值,分别是增加一个这样的字符的代价,删除一个这样的字符的代价,让你求将原先给出的那串字符变成回文串的最小代价。 思路:区间DP,dp[i][j]代表将区间[i,j]变为回文串的最小代价。 #include <string.h> #include < 阅读全文
posted @ 2017-10-10 20:03 声声醉如兰 阅读(124) 评论(0) 推荐(0)
摘要:题意:告诉有n场晚会中需要穿的衣服,衣服是可以套在其他衣服外面的,也就是说如果顺序为 1 2 1,那么可以将2套在1外面,第三场晚会需要穿1的时候把2脱掉即可,这样就只需要穿两次衣服。题目是再告诉了顺序之后需要求出在某种序列下最少需要穿多少次衣服。 思路:区间DP,对于区间【i,j】,如果a[i]在 阅读全文
posted @ 2017-10-09 19:57 声声醉如兰 阅读(140) 评论(0) 推荐(0)
摘要:题意: 给一个B进制的数,一个10进制的数K,B进制数有x位, 对着x位进行全排列的话,有x!种可能, 问这x!的可能中,有多少种可以整除K,各个位置上的数字都不同。 思路:状态压缩,数位DP #include<iostream> #include<cstdio> #include<cstdlib> 阅读全文
posted @ 2017-08-11 00:31 声声醉如兰 阅读(184) 评论(0) 推荐(1)