动态规划
qq_45778406
这个作者很懒,什么都没留下…
展开
-
最长公共上升子序列
link#include <bits/stdc++.h>using namespace std;const int N = 3e3 + 10;int a[N], b[N];int dp[N][N]; // 以b[j]结尾的a[1] ~ a[i], b[1] ~ b[j], 的最长上升子序列int main(){ int n; cin >> n; int ans = 0; for(int i = 1; i <= n; i ++) cin >&g原创 2021-10-06 11:36:50 · 98 阅读 · 0 评论 -
Rarity and New Dress CodeForces - 1393D(思维加dp)
Link题意:给定一个n∗mn ∗ mn∗m 的字符矩阵,判断有多少个相同字符斜正方形。解题思路:我们首先不管别的,对于每一个字符,它都能组成只有一个相同字符的斜正方形。那么其余的就是多种相同字符组合在一起形成的斜正方形了,怎么组合呢?我们不难发现。仔细看这张图,在第一个图形中,若要构成这样的斜正方形,那么最下面的那个点一定要可以往上延伸。即判断当前位置[i][j]与上面四个位置([i−1][j]、[i−1][j−1]、[i−1][j+1]、[i−2][j])([i-1][j]、[i-1][j-1]、转载 2021-05-12 22:20:10 · 152 阅读 · 0 评论 -
牛牛的“质因数”(筛法,dfs)
题目描述算数基本定理,又称唯一分解定理,算术基本定理可表述为:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积。即N=p1e1⋅p2e2…pmem(p1<p2<…pm)N=p_1^{e_1}\cdot p_2{e_2}…p_m{e_m}(p_1 < p_2< … p_m)N=p1e1⋅p2e2…pmem(p1<p2<…pm)朴素的质因子分解算法就是利用了算数基本定理,依次枚举p判断N是否包含素因子p。牛牛最近对于质因原创 2021-02-04 17:39:14 · 290 阅读 · 0 评论 -
红和蓝(树形dp, dfs)
题目描述你拿到了一棵树,请你给每个顶点染成红色或蓝色。要求:每个红点周围有且仅有一个红点,每个蓝点周围有且仅有一个蓝点。“周围”的定义:某点周围的点指通过邻边直接连接的点。所谓树,即没有自环、重边和回路的无向连通图。输入描述:第一行一个正整数 nnn,代表树的顶点个数.。(1≤n≤100000)(1 \leq n \leq 100000)(1≤n≤100000)接下来的 n−1n-1n−1 行,每行两个正整数 uuu 和 vvv,代表点 uuu 和点 vvv 有一条边连接。 (1≤u,v原创 2021-02-02 18:35:02 · 2780 阅读 · 0 评论 -
串
题目描述长度不超过nnn,且包含子序列“us”的、只由小写字母构成的字符串有多少个? 答案对109+710^9+7109+7取模。所谓子序列,指一个字符串删除部分字符(也可以不删)得到的字符串。例如,“unoacscc"包含子序列"us”,但"scscucu"则不包含子序列"us"输入描述:一个正整数nnn(2≤n≤1062 \leq n \leq 10^62≤n≤106)输出描述:一个正整数,为满足条件的字符串数量对109+710^9+7109+7取模的值示例1输入2输出1原创 2021-02-02 12:34:43 · 272 阅读 · 0 评论 -
炮兵阵地
司令部的将军们打算在NM的网格地图上部署他们的炮兵部队。一个NM的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示:如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地形的影响。现在,将军们规划如何部署原创 2021-01-27 01:11:22 · 149 阅读 · 0 评论 -
Mondriaan‘s Dream(状压dp)
题目描述正方形和长方形着迷荷兰著名画家彼得·蒙德里安。一天晚上,他做了个梦,想在厕纸上画出来,他梦中用小长方形以不同的方式填充一个大长方形,而每个小长方形的大小是2x1。他是在这个材料中的专家,他一眼就看出他需要一台计算机来计算填充长方形的方法,这些长方形的尺寸也是整数值。帮助他,使他的梦不会变成一场噩梦!输入输入包含多个测试案例。每个测试案例是由两个整数:高度H和W的大矩形的宽度,且1 <= h,w <=11。当输入H = W = 0时表示终止输出对于每个测试用例,输出不同的填充方原创 2021-01-27 01:08:21 · 626 阅读 · 0 评论 -
选课(树形dp,分组背包)
大学实行学分制。每门课程都有一定的学分,学生只要选修了这门课并通过考核就能获得相应学分。学生最后的学分是他选修各门课的学分总和。每个学生都要选择规定数量的课程。有些课程可以直接选修,有些课程需要一定的基础知识,必须在选了其他的一些课程基础上才能选修。例如《数据结构》必须在选修了《高级语言程序设计》后才能选修。我们称《高级语言程序设计》是《数据结构》的先修课。每门课的直接先修课最多只有一门。两门课也可能存在相同的先修课。为便于表述,每门课都有一个课号,课号依次为 1,2,3,⋯。下面举例说明:课原创 2021-01-23 18:13:12 · 292 阅读 · 0 评论 -
Godfather(树形dp,求重心模板)
题目描述给一棵树,求树的重心名词解释删除一个点,使得形成的多棵树中节点数最大的树的节点数最小。这个点即为树的重心。输入格式一行一个整数n,即树的节点个数(n<=5*10^4)接下来n-1行,每行两个整数,表示树上一条边。输出格式如果有多个重心,则按编号从小到大依次输出样例输入61 22 32 53 43 6样例输出2 3提示卡vector,建议用手写的链式前向星或邻接表思路:模板直接写即可,两种做法1.两次扫描法#include <algor原创 2021-01-23 17:15:27 · 234 阅读 · 1 评论 -
ACboy needs your help(分组背包)
Acboy这个学期有N门课程,他计划最多花M天学习。当然,他将从不同的课程中获得的利润取决于他花在这门课程上的天数。如何安排M天学习N门课程,以使利润最大化?Input输入由多组数据组成。一组数据以包含两个正整数n和m的一行开始,n是课程数,m是ACboy拥有的天数,接下来输入一个矩阵a[i][j],a[i][j]表示ACboy如果在第i门课程上花费j天,他将获得值a[i][j]的利润。(1<=i<=N<=100,1<=j<=M<=100)输入以n=0,m=0结束。原创 2021-01-21 21:16:27 · 395 阅读 · 0 评论 -
Coins(多重背包)
给出硬币面额及每种硬币的个数,求从1到m能凑出面额的个数。Input多组数据,每组数据前两个数字为n,m。n表示硬币种类数,m为最大面额,之后前n个数为每种硬币的面额,后n个数为相应每种硬币的个数。 (n<=100,m<=100000,面额<=100000,每种个数<=1000)OutputRTSample Input3 101 2 4 2 1 12 51 4 2 10 0Sample Output84思路:看题目典型的多重背包,可以化成01背包,原创 2021-01-21 21:01:54 · 367 阅读 · 0 评论 -
陪审团(01背包, 难)
在一个遥远的国家,一名嫌疑犯是否有罪需要由陪审团来决定。陪审团是由法官从公民中挑选的。法官先随机挑选N个人(编号1,2…,N)作为陪审团的候选人,然后再从这N个人中按照下列方法选出M人组成陪审团。首先,参与诉讼的控方和辩方会给所有候选人打分,分值在0到20之间。第 i 个人的得分分别记为p[i]和d[i]。为了公平起见,法官选出的M个人必须满足:辩方总分D和控方总分P的差的绝对值|D-P|最小。如果选择方法不唯一,那么再从中选择辨控双方总分之和D+P最大的方案。求最终的陪审团获得的辩方总分D、原创 2021-01-21 18:38:52 · 125 阅读 · 0 评论 -
dividing(多重背包)
E - Dividing HDU - 1059有6种宝石,价值分别为1,2,3,4,5,6。现在有一个长度为6的数组,第i个数字表示价值为i的宝石的数量。例如:[1,0,1,2,0,0]表示有一个价值为1的宝石,一个价值为3的宝石和两个价值为4的宝石。请判断能否将所有宝石分为两部分,使得两部分价值相等。注意:宝石不能分割,比如价值为6的宝石不能分割为两个价值为3的宝石。Input每一行输入描述一个要划分的宝石集合。每个集合有6个非负整数a1, a2,…, a6,其中ai为价值i的宝石数量。原创 2021-01-21 16:46:30 · 385 阅读 · 0 评论 -
最小正子段和
H - 最小正子段和 51Nod - 1065N个整数组成的序列a1,a2,a3,…,an,从中选出一个子段(ai,ai+1,…aj),使这个子段的和>0,并且这个和是所有和>0的子段中最小的。例如:4,-1,5,-2,-1,2,6,-2。-1,5,-2,-1,序列和为1,是最小的。Input第1行:整数序列的长度N(2 <= N <= 50000) 第2 - N+1行:N个整数Output输出最小正子段和。Sample Input84-15-2-12原创 2021-01-19 17:02:24 · 455 阅读 · 0 评论 -
摆花
F - 摆花 计蒜客 - T2071dp[i][j] 表示花已经摆到第i种花,已经摆了j个花盆的数量了,第i种花可以在摆0~a[i]的数量时的方案和,显然dp[i][j + k] = dp[i] - 1[j] + dp[i][j + k]原创 2021-01-19 15:34:36 · 102 阅读 · 0 评论 -
石子合并(环形)
石子合并 LibreOJ - 10147主要思路:按找线性来做 dp[i][j] = max(dp[i][j], dp[i][k] + dp[k + 1][j] + sum[i][j])把环形处理成线性即可,直接开2倍数组,如1 3 4 5, 写成 1 3 4 5 1 3 4 5,即可找该数组中找到环形中每一个状态#include<bits/stdc++.h>using namespace std;const int N = 200 * 2 + 10;int a[N], n;in原创 2021-01-19 13:04:51 · 143 阅读 · 1 评论