线性DP
wtcl
这个作者很懒,什么都没留下…
展开
-
牛客多校三 Two Matchings(思维+dp)
题目:https://ac.nowcoder.com/acm/contest/5668/E思路:1.把数组从小到大排序2.第一组:相邻的两个为一对3.第二组:四个或六个为一小组,小组内两两为一对(有多种情况,从中选择一种最小的,这个组合是确定的) ,用dp来做。#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;#原创 2020-07-19 12:19:13 · 149 阅读 · 0 评论 -
Codeforces Round #642 (Div. 3) E. K-periodic Garland(dp/贪心)
题意: 给你一个长度为 N 的 01 字符串和一个整数 K 每次操作你可以选择一个字符并改变其状态 现要使字符串中相邻 1 的距离为 K,问最少需要操作几次思路:状态:dp[i][0] 表示第i项之前都符合要求且第i项为0dp[i][1] 表示第i项之前都符合要求且第i项为1状态转移:dp[i][0] 可以由dp[i-1][0] dp[i-1][1] 得到dp[i][1] 两种情况:1. i之前都为0;2. 2.i-k为1,[i-k,i-1]都为0;可以求一个前缀和pre[.原创 2020-05-15 10:37:45 · 165 阅读 · 0 评论 -
Mr. Young's Picture Permutations POJ - 2279
题目大意:给出不超过5的k,有k行学生,当前行人数不超过后一行,每行学生有 ni 个,其中这些学生身高各不相同。要求每一排从左到右身高递减,每一列从后到前身高递减。设F[a1][a2][a3][a4][a5]表示各排从左边分别站了a1,a2,a3,a4,a5人时的方案数。则可得转移方程。其中我们可以发现,设计动态规划的转移方程,不一定要以如何计算出一个状态的形式给出,也可以考虑一个已知...原创 2019-10-27 15:02:33 · 100 阅读 · 0 评论 -
FatMouse's Speed HDU - 1160
题目大意:给你一个长度不超过1000的序列,然后每个元素包含两个数字和,现在要你找出一个最长的子序列使得这个序列满足按w递增而按v递减,然后输出长度和所选子序列顺序。最长上升子序列#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using nam...原创 2019-09-07 17:07:55 · 47 阅读 · 0 评论 -
最少拦截系统 HDU - 1257
最长上升子序列#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;int a[100010];int dp[100010];int main(){ int n; while(scanf("%d",&am...原创 2019-09-07 16:34:49 · 79 阅读 · 0 评论 -
Tickets HDU - 1260
题意就是有n个人排队买票,每个人需要的时间是a[i] (1=< i <=N),但是现在可以两个人合买, 合买只能和前面一个人或者后面一个人合买,所用时间已知。#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace ...原创 2019-09-07 15:57:07 · 109 阅读 · 0 评论 -
免费馅饼 HDU - 1176
题意:有一条路用坐标轴0到10表示,如上图所示,现在有个人站在5这个点,这时天上掉下馅饼,每一秒在不同位置掉下馅饼,但是这个人得反应能力有限,他只能接住他站得点以及他站的点得左右两个点,问最多能接住多少个馅饼。思路:有一个二维dp数组dp[i][j]表示在第i秒j位置能接住得最大馅饼,那么在0这个点就有dp[i][j]=dp[i][j]+max{dp[i+1][j],dp[i+1][j+1]...原创 2019-09-07 15:34:45 · 112 阅读 · 0 评论 -
Super Jumping! Jumping! Jumping! HDU - 1087
题目大意 要求找到一个上升的子序列(不连续) 要求和最大#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#define ll long longusing namespace std;ll a[1010];ll dp[1010];int ma...原创 2019-09-07 14:40:36 · 84 阅读 · 0 评论 -
FatMouse and Cheese HDU - 1078
题意:给你一个n*n的矩阵数列求出连续上升的序列和。其中移动的最大范围你所在的位置为k.记忆化搜索+dpdp[i][j] 表示点(x,y)到结束的最大值。#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;...原创 2019-09-06 17:26:51 · 58 阅读 · 0 评论 -
Phalanx HDU - 2859
题意:给你一个nn的字符矩阵,从中选出一个最大的子矩阵(mm)满足关于斜对角线(左下角到右上角)对称,求出这个矩阵的大小m;我们可以用dp[i][j]表示当前位置到右上角这个子矩阵所能表示对称的矩阵最大值;#include<cstdio>#include<cstring>#include<algorithm>#include<iostream&g...原创 2019-09-06 16:42:13 · 80 阅读 · 0 评论 -
Milking Time POJ - 3616
题意: 总共 N 小时 , M 个产奶时段, 每次产奶后需要休息 R 小时。给你 M 组数据, 每组数据 包括 :时段的开始时间点, 结束时间点, 时间段产奶量。最长上升子序列变形#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using na...原创 2019-09-05 20:35:44 · 94 阅读 · 0 评论 -
Monkey and Banana HDU - 1069
题意:给出n中方块,每个方块有长宽高三个元素;每种方块有无数个;现在叠箱子,上面的箱子的长宽比下面的小;问能叠出的最大的高度;首先按照长度从小到大排序,长度相等的,按宽从小到大排序。然后对宽求最长上升子序列。#include<cstdio>#include<iostream>#include<cstring>#include<algorithm...原创 2019-09-05 20:12:19 · 62 阅读 · 0 评论 -
Ignatius and the Princess IV HDU - 1029
题意: 给你n个数字,让你求出出现次数为(n+1)/2 的数为多少。 两种方法(水)1.直接排序 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int a[...原创 2019-09-05 19:20:24 · 49 阅读 · 0 评论 -
Max Sum Plus Plus HDU - 1024
题目链接:https://cn.vjudge.net/problem/HDU-1024题意:给你n个数,让你找m组个连续序列,使m个连续序列最大(要求也是序列不重叠),输出m组序列和的最大值。状态:dp[i][j] 前j个数m个连续序列,且必选j.(如果不这样定义不清楚前面的数是如何分组的)转移方程:dp[i][j]=max(dp[i][j-1],dp[i-1][k])+a[j];(i-1&...原创 2019-09-05 17:14:04 · 61 阅读 · 0 评论 -
Common Subsequence POJ - 1458
最长公共子序列若题目中没有说明一般字串 连续子序列 不连续#include<cstdio>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;char s1[2100],s2[2100];int dp[2100][2100];int ma...原创 2019-09-04 22:42:17 · 52 阅读 · 0 评论 -
Help Jimmy POJ - 1661
dp首先要确定状态。竖直方向所用时间是一定的,可以最后直接加Y。刚开始想的是从高到低,发现这样无法确定状态。从上往下,每一个平面有可能从上面多个平面推出。而从下往上,一个平面只能从下面一个平面推出。将0,Y都变成一个平面。原问题 从第0层到n+1层的时间。子问题 从第i层到n+1层的时间。因为同一层有左右两个状态,所以需要二维数组。状态:dp[i][0], 从i层左边到地面所用...原创 2019-09-04 20:02:31 · 130 阅读 · 0 评论 -
Making the Grade POJ - 3666
定义:dp[i][j]:前i个数不下降,第i个数凑成v[j]时的最小花费dp[i][j]:前i个数不下降,第i个数凑成v[j]时的最小花费dp[i][j]=min(dp[i−1][k]+abs(a[i]−v[j]))(1<=i<=n,0<=k<=j<m)但我们发现这样写过后是O(n3)的时间复杂度对于数据是过不了的,那我们要优化!用一个minn来记录1到当前j的...原创 2019-09-03 19:08:16 · 106 阅读 · 0 评论