题目链接:http://poj.org/problem?id=3666 题意是给出一组数,每个数代表当前位置的地面高度,问把路径修成非递增或者非递减,需要花费的最小代价? ///用dp[i][j]表示:前i个数构成的序列,这个序列最大值为j,dp[i][j]的值代表相应的cost. ///dp[i][j]=abs(j-w[i])+min(dp[i-1][k]);(k<=j) ///i-1构成的序列,最大值是k + (j-w[i])变成此步需要的花费 因为要把路径修成非递减路径,所以a[j]>a…
题意 你有一组非零数字(不一定唯一),你可以在其中插入任意个0,这样就可以产生无限个数.比如说给定{1,2},那么可以生成数字12,21,102,120,201,210,1002,1020,等等. 现在给定一个数,问在这个数之前有多少个数.(注意这个数不会有前导0). 思路 注意题目的数据不一定只有1,或者2,而是看输入有多少数字. 其实可以转化为,有多少个全排列小于给定的数字,因为把0去掉相当于把0拿到前面去.具体写的时候,类似数位dp的思路. #include <algorithm> #i…
学到了一个引理:在满足S最小化的条件下,一定存在一种构造序列B的方案,使得序列B中的数值都来自于A中.(数学归纳法+中位数定理得证) 对于状态的表示来说,首先肯定有一个 i ,表示选到了第 i 个数时对应的最优解,由于需要维护序列单调性,因此需要再在状态中加入一个因素 j ,表示在第 i 位选了离散化后的A[ j ]. 状态转移为\(dp[i][j]=min\{dp[i-1][k],k\in[1,j]\}+|A[i]-B[j]|\) 代码如下: #include <cstdio> #inclu…
Description A straight dirt road connects two fields on FJ's farm, but it changes elevation more than FJ would like. His cows do not mind climbing up or down a single slope, but they are not fond of an alternating succession of hills and valleys. FJ…
题意: 给定一个序列,以最小代价将其变成单调不增或单调不减序列,代价为Σabs(i变化后-i变化前),序列长度<=2000,单个数字<=1e9 输入:(第一行表示序列长度,之后一行一个表示序列第i的大小) 7 1 3 2 4 5 3 9 输出:(代价)   3 分析: 这道题有bug,只要求单调不减序列 首先,对于这种问题,我们容易想到DP 记dp[i][j]为处理到i个,最高的为j 那我们的dp[i][j]=min(dp[i-1][k])+abs(j-h[i]) (k<=j) 但是显然…
题目来源:网易有道2013年校园招聘面试二面试题 题目描述: 小明每天都在开源社区上做项目,假设每天他都有很多项目可以选,其中每个项目都有一个开始时间和截止时间,假设做完每个项目后,拿到报酬都是不同的.由于小明马上就要硕士毕业了,面临着买房.买车.给女友买各种包包的鸭梨,但是他的钱包却空空如也,他需要足够的money来充实钱包.万能的网友麻烦你来帮帮小明,如何在最短时间内安排自己手中的项目才能保证赚钱最多(注意:做项目的时候,项目不能并行,即两个项目之间不能有时间重叠,但是一个项目刚结束,就可以…
题目大意: 给出长度为n的整数数列,每次可以将一个数加1或者减1,最少要多少次可以将其变成单调增或者单调减(不严格). 题解: 1.一开始我有一个猜想,就是不管怎么改变,最终的所有数都是原来的某个数.然而我并不会证明,然而我属于那种不彻底弄清楚就不会去写的那种顽固分子,于是就脱了好几天.网络上有很多关于此题的题解,确实用了这个猜想来离散化,但是都是讲怎么dp,然后最后扯一句“由于数据比较大,可以离散化”之类的话,要么就是相当粗略的证明(也许已经说的够清楚了只不过我没理解...). 2.今天早上起…
Reference:http://www.cnblogs.com/wuyiqi/archive/2012/03/28/2420916.html 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2836 题目大意:计算序列有多少种组合,每个组合至少两个数,使得组合中相邻两个数之差不超过H,序列有重复的数.MOD 9901. 解题思路: 朴素O(n^2) 以样例1 3 7 5为例,如果没有重复的数. 设dp[i]前n个数的方案数,初始化为1. 那么fo…
先离散化,然后逆着dp,求出每个点能取到的最大利益,然后看有没有钱,有钱就投 想法好复杂 #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <stri…
All Possible Increasing Subsequences Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Appoint description:  Description An increasing subsequence from a sequence A1, A2 ... An is defined by Ai1, Ai2 ... Aik, where the follow…
题目链接 感觉这道题我看了很多天,胡思乱想啊,一开始觉得记忆化搜索会可能T啊,,可能出题人的数据卡的好就稳T了的感觉..后来想了想,好像离散化一下,记一下位置之后再记忆化搜索就应该稳了吧..(好像直接搜也不会T的,,??) #include <set> #include <map> #include <queue> #include <stack> #include <math.h> #include <bitset> #includ…
P1052 过河 dp不难,重点是要想到离散化. 石子个数$<=100$意味着有大量空间空置,我们可以缩掉这些空间. 实现的话自己yy下就差不多了. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define re register using namespace std; int max(int &a,int &b){return…
题意:给定 n 个区间,让你选出一些,使得每个选出区间不交叉,并且覆盖区间最大. 析:最容易想到的先是离散化,然后最先想到的就是 O(n^2)的复杂度,dp[i] = max(dp[j] + a[i].r - a[i].l) 区间不相交,这个可以用线段树来维护一个最大值,因为有区间性,但是也可以不用线段树,直接进行线性DP,因为要选的区间越多越好,相比而言,有就要选,但是有更优的就选最优的. 代码如下: #pragma comment(linker, "/STACK:1024000000,102…
题目:http://poj.org/problem?id=3666 很普通的DP,离散化(sort)一下即可: mn的求法很不错(比我原来开了mn[]……简洁). 代码如下: #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> using namespace std; ],l[],f[][],ans,mn,INF=; i…
E. Hanoi Factory time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Of course you have heard the famous task about Hanoi Towers, but did you know that there is a special factory producing the…
dp非常好想, f[i] = min(f[i-len] + stone[i]) s <= len <= t 然后因为L非常大,所以我就不知道该怎么搞了 我看到m只有100,而L有1e9,我就知道肯定要通过某种数学方法来离散化 然而我并没有想出来这个数学方法 看来题解,原来这个方法很简单,我怎么就没有想到 因为最大走10步,所以把距离对1到10的最小公倍数是2520取模就好了. 离散化之后就可以愉快地dp了 #include<cstdio> #include<algorithm…
题意: 给定数组a[n],用两种操作: 1.将数组中所有值为x的数移至开头 2.将数组中所有值为x的数移至末尾 问,经过最少多少次操作,能将数组a[n]变为非递减的有序数列? (1<=n<=3e5,1<=a[i]<=n) 思路: 如果一个数全部分布在一段连续的区间上,那么可以不移动这个数.如果有好几个这样的连续的连续区间,且它们都是非递减的,那么这一个大区间内的数都可以不移动.因此只要求出最大的(所含数种类最多的)大区间,就能得到答案(只移动剩余的数). 将所有数离散化之后,记录每…
目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:Portal传送门  原题目描述在最下面.  1e5个点,问从(0,0)走到(1e9,1e9)的最大收益.  当你从(u-1,v-1)走到(u,v)时,你可以获得点(u,v)的权值. Solution:  十分详细了.  直接线段树区间最值.当然也可以树状数组,不能st表.  \(dp[i] = max(query\_max(0,dp[i]-1,1)+val[i] ,…
题目描述 The streets of Byte City form a regular, chessboardlike network - they are either north-south or west-east directed. We shall call them NS- and WE-streets. Furthermore, each street crosses the whole city. Every NS-street intersects every WE- one…
题目大意:给定一个长度为 N 的序列,有 M 个点对答案的贡献为 1,其余为 0,现从起点出发,每次只能走 [s,t] 个单位,求从起点走到终点时答案贡献最小是多少. 题解:由于 N 很大,无法直接记录状态.观察发现 M 很小,且 [s,t] 也很小,因此,考虑到只有在答案贡献为 1 的点的附近 dp 值才可能会发生变化,其余位置会导致大量的解的重复而浪费时间和空间.基于以上想法,考虑缩点,即:对于两个石子之间的距离来说,是否存在一个点 s0 使得当 s>s0 时,无论从前一个石子之前的任何位置…
题目链接 错解: #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; typedef long long LL; ; int a[N]; int m[N][N]; // dp[i][j] 状态结尾的值 LL dp[N][N];// 前i个元素有序最大值小于等于a[j]的最值 int n; int main () {…
传送门 有个结论,每一个位置修改高度后的数,一定是原来在这个数列中出现过的数 因为最终结果要么不递增要么不递减, 不递增的话, 如果x1 >= x2那么不用动,如果x1 < x2,把x1变成x2的代价最小 不递减同理 输入数组a后,把a数组复制一份放到b中,并将b排序 f[i][j]表示前i个,当前修改为b[j]的最优解 dp的时候前缀和优化一下即可 #include <cstdio> #include <cstring> #include <iostream&g…
有问题的话欢迎在评论区提出 题意: 题目链接 你是一个送快递的,现在给你一个环,环的边有权值,代表走这条边所花的时间,每个点代表一个地点,点有点权,代表这个点上有多少货物需要你送.初始时间\(t=0\),每到一个点,你就可以瞬间送完该点所有的货物,但每一个货物都会给你带来值为当前时间的罚款.现在你要送完所有货物,问最优情况下你的罚款最少是多少. 题解: 从样例可以看出,这题的核心就在于,快递员可以"反复横跳",比如可以先逆时针送完一个点的货物,再掉头沿顺时针方向送完所有其它点的货物(尽…
因为是单调不降或单调不升,所以所有的bi如果都是ai中出现过的一定不会变差 以递增为例,设f[i][j]为第j段选第i大的高度,预处理出s[i][j]表示选第i大的时,前j个 a与第i大的值的差的绝对值 的和. 转移显然是 \[ f[i][j]=min{f[i-1][k]+s[i][j]-s[i][k]} \] 这样看起来是\( O(n^3) \)的,但是注意到s[i][j]固定 \[ f[i][j]=min{f[i-1][k]-s[i][k]}+s[i][j] \] 这样就可以在处理i-1的时…
1105 过河 2005年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,……,L(其中L是桥的长度).坐标为0的点表示桥的起点,坐标为L的点表示桥的终点.青蛙从桥的起点…
题意: 输入一个正整数N(N<=2^30),输出从1到N共有多少个数字包括1. AAAAAccepted code: #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; int main(){ ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n; cin>>n; ; ,r=,low_bit=,yushu…
Problems(1300-1600) an ac a day keeps the doctor away Gas Pipeline (1500) 2019.10.28 题意: 管道工人需要在一段凹凸不平的道路上铺管子,给一串长度为n的01序列描述地形,1表示一定要把水管用钢管架高在离地面2个单位,0表示水管离地面高度可以为1,也可以为2. 在转折的地方需要额外花费1单位的水管,给定水管和钢管的价格a,b:问最少需要花费多少钱 思路:线性DP,用dp[i] [j] 表示前j列在第j列在第i层时的…
有时需为视图属性指定大小尺寸值(通常以像素为单位,但有时也用点.毫米或英寸).最常见的属性有: 文字大小(Text Size),指设备上显示的文字像素高度: 边距(Margin),指定视图组件间的距离: 内边距(Padding),指定视图外边框与其内容间的距离. Android 使用 drawable-ldip.drawable-mdip 以及 drawable-hdip 三个目录下的图像文件自动适配不同像素密度的屏幕.假如图像完成了自动适配,但边距无法缩放适配,又或者用户配置了大于默认值的文字…
题意:给一个n*m的矩阵,每个点是一个蛋糕的的重量,然后小明只能向右,向下走,求在不超过K千克的情况下,小明最终能吃得最大重量的蛋糕. 思路:类似背包DP: 状态转移方程:dp[i][j][k]----在i,j位置时,最大容量为k时的最大值: 做背包循环一般从1开始,因为需要坐标-1的情况,从0开始需要特判,而且容易RE: #include <iostream> #include <cmath> #include <cstdio> #include <cstrin…
//Accepted 4100 KB 0 ms //类似poj1080 //dp[i][j]表示s1用前i个,s2用前j个的最少匹配步数 //dp[i][j]=min(dp[i][j-1]+1,dp[i-1][j-1](s1[i-1]==s2[j-1])时 or dp[i-1][j-1]+1 (s1[i-1]!=s2[j-1]时)) //注意初始化条件 //dp[i][0]=inf; //dp[0][i]=i; //dp[0][0]=0; #include <cstdio> #include…