
简单dp
Sleppypot
困难的路越走越容易,容易的路越走越难。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
dp1.1
题目:cf363c 题意:给你n天的情况 0 代表休息 1 代表只能参加contest或休息 2 代表只能参加gym或休息 3 代表能参加contest或gym或休息要求 不能连续参加contest 不能连续参加gym问 如何安排使得休息日最少 输出休息日的数量 解答:d[i][j]表示第i天做什么。j=0:休息。j=1:gym。j=2:休息。 #incl原创 2016-10-14 22:15:25 · 558 阅读 · 0 评论 -
入门级dp
题目:hdu1260 题意:每个人去买花,要么两个人一起买用一个时间,要么一个人一个人单独买,问总共的最少的时间 解答:简单dp。状态转移方程dp[i+1] = min(dp[i]+a[i+1],dp[i-1]+b[i]); #include #include #include using namespace std; const int MAXN = 2010; int dp[2010];原创 2016-12-02 01:50:20 · 365 阅读 · 0 评论 -
dp/单调栈
题目:hdu1506 题意:一个柱形图,宽均为1.内部最大的矩形的面积。 解答:刚开始想的是从某个区间内找小的高遍历所有区间找出最大的矩形。但是复杂度太高啦! 正确的解答: 从每一条出发,分别求出这一条左边连续比它高的和右边连续比它高的坐标。然后遍历一遍便可以求出最大值。 左右!!!可以分别从左边和右边遍历求!!! 以左边为例: 如果左边那个比它高,那么比它左边还高的一定比它原创 2016-12-02 13:45:46 · 506 阅读 · 0 评论 -
最长上升子序列
最长上升子序列,众所周知,是dp的经典问题。用简单的dp解决的复杂度是O(n方),用dp+二分的方法解决的复杂度是O(nlogn). 1、转移方程: MaxLen (1) = 1 MaxLen (k) = Max { MaxLen (i):1 2、 假定存在一个序列d[1...9]=2 1 5 3 6 4 8 9 7,可以看出LIS长度为5。现在开始一步一步的找出原创 2017-02-23 14:33:07 · 278 阅读 · 0 评论 -
最大连续子序列和
直接贴代码! int cal(int *q,int len) { int sum = 0; int Max = 0; for(int i = 0;i < len;i++) { sum += q[i]; if(sum < 0) sum = 0; if(sum > Max)原创 2017-03-04 22:42:54 · 243 阅读 · 0 评论 -
入门级dp2
题目:hdu1158 题意:输入num个月,输入每个月雇佣员工、员工薪资、解雇员工所用的钱。输入每个月至少需要多少个员工(num个数)。 解答:dp.注意初始状况:第一个月要分开讨论。注意每一段的取值范围。 #include #include #include #include using namespace std; const int MAXN = 100 + 10; const int原创 2017-03-21 20:48:02 · 351 阅读 · 0 评论 -
最长上升子序列的变化
题目:hdu1160 题意:一群老鼠,每个老鼠有两个参数:重量和速度。寻找重量递增且速度递减的最长的子序列,输出该序列的坐标顺序。 解答:先排序,然后最长上升子序列。注意:排序后坐标会改变,因此,应当在结构体中引入一个新的变量index,保存它的原始位置。保存路径:记录比当前位置小的上一个位置的左边即可。 #include #include #include #include using n原创 2017-03-22 00:51:57 · 358 阅读 · 0 评论 -
简单dp之——m段子序列的最大和
题目:hdu1024 题意:m:分成m段。n:数组长度。给定一个数组求m段子区间的最大和 解答:dp[i][j]:前j个数分成i组的最大子区间和。 1、状态转移方程:dp[i][j] = max(dp[i][j-1] + a[j],max(dp[i-1][k](0 2、优化成一维的。 (1)将i放入外层循环当中 (2)如何求max(dp[i-1][k])? dp[i-1][k]相当原创 2017-01-12 21:46:49 · 1441 阅读 · 0 评论 -
关于一些数的划分问题
问题一:将n划分为若干正整数之和,有多少种划分方法?(hdu1028) 思路一:相当于1-n的完全背包,总重量为n,有多少种组合? 思路二:dp[i][j]表示将i分为最多j组的划分方法数 转移方程为:dp[i][j] = dp[i][j-1] + dp[i-j][j] (i dp[i[j] = dp[i][j-1] + 1(i = j)原创 2017-07-05 21:32:41 · 426 阅读 · 0 评论