![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
简单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 · 500 阅读 · 0 评论 -
入门级dp
题目:hdu1260题意:每个人去买花,要么两个人一起买用一个时间,要么一个人一个人单独买,问总共的最少的时间解答:简单dp。状态转移方程dp[i+1] = min(dp[i]+a[i+1],dp[i-1]+b[i]);#include#include#includeusing namespace std;const int MAXN = 2010;int dp[2010];原创 2016-12-02 01:50:20 · 323 阅读 · 0 评论 -
dp/单调栈
题目:hdu1506题意:一个柱形图,宽均为1.内部最大的矩形的面积。解答:刚开始想的是从某个区间内找小的高遍历所有区间找出最大的矩形。但是复杂度太高啦! 正确的解答:从每一条出发,分别求出这一条左边连续比它高的和右边连续比它高的坐标。然后遍历一遍便可以求出最大值。左右!!!可以分别从左边和右边遍历求!!!以左边为例:如果左边那个比它高,那么比它左边还高的一定比它原创 2016-12-02 13:45:46 · 454 阅读 · 0 评论 -
最长上升子序列
最长上升子序列,众所周知,是dp的经典问题。用简单的dp解决的复杂度是O(n方),用dp+二分的方法解决的复杂度是O(nlogn).1、转移方程:MaxLen (1) = 1MaxLen (k) = Max { MaxLen (i):12、假定存在一个序列d[1...9]=2 1 5 3 6 4 8 9 7,可以看出LIS长度为5。现在开始一步一步的找出原创 2017-02-23 14:33:07 · 234 阅读 · 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 · 210 阅读 · 0 评论 -
入门级dp2
题目:hdu1158题意:输入num个月,输入每个月雇佣员工、员工薪资、解雇员工所用的钱。输入每个月至少需要多少个员工(num个数)。解答:dp.注意初始状况:第一个月要分开讨论。注意每一段的取值范围。#include#include#include#includeusing namespace std;const int MAXN = 100 + 10;const int原创 2017-03-21 20:48:02 · 307 阅读 · 0 评论 -
最长上升子序列的变化
题目:hdu1160题意:一群老鼠,每个老鼠有两个参数:重量和速度。寻找重量递增且速度递减的最长的子序列,输出该序列的坐标顺序。解答:先排序,然后最长上升子序列。注意:排序后坐标会改变,因此,应当在结构体中引入一个新的变量index,保存它的原始位置。保存路径:记录比当前位置小的上一个位置的左边即可。#include#include#include#includeusing n原创 2017-03-22 00:51:57 · 328 阅读 · 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 · 1367 阅读 · 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 · 382 阅读 · 0 评论