动态规划
文章平均质量分 56
_夜风
我好懒怎么办
展开
-
nyoj 17
// nyoj 17 代码如上,用的是dp,总的来说就是对一个字符串从末尾开始比较,设定一个数组,存放每个单调字串的最大长度,最后比较。。。//要注意的就是里面if语句对于每次字符比较后,更新数组,自己在纸上画画就清楚了。。。 #include #include using namespace std;int main(){ int i,原创 2014-12-11 14:37:30 · 421 阅读 · 0 评论 -
HDU3480
题意:给你n个数,然后让你分成m个集合,每个集合有一个值(最大值减最小值,然后平方),求整个集合的可能最小值。思路:因为每个集合里的值只和最大和最小值有关,所以很容易想到先排序,然后用DP可求得解,状态转移方程dp[i][j] = min(dp[i][j] , dp[k][j - 1] + (a[i] - a[k + 1]) ^ 2),j表示数组的下标,i表示集合数,dp为最小值,但是因为原创 2015-08-02 16:27:17 · 665 阅读 · 0 评论 -
ZOJ1463
题意:给一个括号字符串,求解最少添加的字符能使整个字符串匹配。输入:s(未匹配的字符串)输出:S(匹配后的字符串)思路:绝壁超级坑的一道题,格式我不想说什么了,特坑,然后就是对给定的字符串,如果要求添加最小的字符满足添加后的能匹配,那么你需要在里面找到最大的子串,子串必须满足最大匹配量这个条件,所以对于i到j,利用状态转移方程MAX = max(MAX,map[i]原创 2015-07-20 21:08:45 · 464 阅读 · 0 评论 -
NYOJ737
题意:给n堆石子,按照顺序排列,只能相邻两堆石子合并,求最后合并为一堆时所花费的最小代价,石子合并代价为两堆石子之和。输入:n(石子堆数)Xi(每堆石子个数)输出:T(最小代价)思路:经典石子归并问题,区间DP,原谅我对DP并不怎么感冒,简单点来说,首先预处理记下i到j的石子总数,用数组存放,然后在DP的过程中,因为求解的是最小代价,我们可以这样想,先找出两原创 2015-07-20 15:29:32 · 538 阅读 · 0 评论 -
ZOJ1524
题意:给定需要购买物品的顺序以及总物品对应的价格,求解按顺序购买物品时最小花费。输入:m,n(m代表需要购买物品的清单,n代表总的物品数)Xi...(代表对应物品的序号以及价格)输出:cost(最小花费,有精度要求)思路:对于商品j,有购买和不购买两种选择,并且如果j序号正好和i匹配,说明是符合条件的,那么此时最小花费应是不买(dp[1][j])和购买(dp[0原创 2015-07-20 10:30:08 · 436 阅读 · 0 评论 -
ZOJ3161
朴素动态规划ZOJ3161题意:(严重标题党)老板不想让客人走,客人不想留,客人按顺序排好,老板抽8g(书上翻译成八卦,神翻译),抽到的如果相邻,其中一个人由客人决定离开,求最后黑心的老板最多能让多少人留下。输入:n(客人个数),m(8g关系对数)a(客人a),b(客人b)(m行)输出:T(最多留下的人数)思路:之前看题目原创 2015-07-16 16:19:11 · 563 阅读 · 0 评论 -
SGU131--NYOJ435
参考bloghttp://m.blog.csdn.net/blog/u012760629/36927465http://www.cppblog.com/menrowitianya/archive/2014/06/23/207386.htmlsgu131题意:给你一个n*m的矩形,可以填充1*2或者缺一角的2*2矩形,求填发?输入:n,m(n,m输出:原创 2015-07-17 19:59:35 · 509 阅读 · 0 评论 -
HDU3757
题意:一些团队因为任务要去避难所,并且每个避难所必须要有团队在,避难所的数量小于等于团队的数量,团队去避难所的消耗油量与路程成正比,求解最小耗油量。题目来源:2010 Northeastern European Regional Contest输入:T(示例)n(团队个数)a,b,c...(团队坐标,无序排列)m(避难所个数)a1,b1,c1...(避难所坐标,原创 2015-07-18 16:06:11 · 544 阅读 · 0 评论 -
ZOJ3527
题意:给你一个有向图,一共N个顶点,且每个顶点只有一个前驱或后继,在顶点上建立圣地,那么就可以获得一个信仰值,如果在这个顶点的后继节点上也建立圣地,那么将改变一定的信仰值,求解能获取的最大信仰值。思路:好吧,这题一点思路都没有,本来题目就做的比别人少,树状DP什么的,更是少,这次要不是准备好好研究下DP问题,估计想都没想过去接触这种东西,只怪自己太懒了。题目是求最大值的,所以考虑要不要在这原创 2015-07-25 18:42:23 · 460 阅读 · 0 评论 -
HDU5317
题意:定义一个数K,最小质因数形式为K = a*b*c形式(如12 = 2*2*3),相同只取一个(所以12只能取2,3两个,既F[12]=2)给L,R区间,找出区间内最大的F[x](L思路:先打素数表,然后枚举1000000内全部数,因为可能值只能为2,3,5,7,11,13,17这7个数,所以arr数组存放每个数对应的值的个数,然后用dp数组来表示下标为i并且小于i的所有数为j值的个数原创 2015-07-28 23:19:07 · 724 阅读 · 0 评论 -
HDU3853
题意:给R*C的迷宫,起点为1,1 终点为R,C 且给定方格所走方向的概率,分别为原地,下边,右边,求到终点的期望。思路:既然是求到终点的期望,那么DP代表期望,所以DP[i][j]=原地的概率*DP[i][j]+向右的概率*DP[i+1][j]+想下的概率*DP[i][j+1]+2,2代表所花费的水晶,那么只要从终点递归到起点即可求解。#include #include #inclu原创 2015-07-25 14:13:58 · 476 阅读 · 0 评论 -
单调最长递增子序列
// 再一次复习 最长单调递增子序列dp求法// 以前有过一次专门的总结,现在有点忘了,拿出来看看// 目前为止,我做过的这类题目就1.最长子序列和 2.字母和数字单调最长序列。。。后面继续总结 #include #include #include #include using namespace std;int main(){ char原创 2014-12-11 12:46:59 · 382 阅读 · 0 评论 -
hdu 1003
这个是暴力枚举求解的//hdu1003 这一题的代码我也不愿意整理了,乱就乱吧这一道题已经写了至少五遍了,也没什么好说的了,核心代码就是第二个for那里自己在纸上写写就清楚了,后面一个for找最大,然后依据这个最大的可以推出是从哪里开始的,根据就是每次往回加一个然后判断和是否等于最大的,在纸上写写就清楚了。。。。 #include #include u原创 2014-12-11 14:38:00 · 518 阅读 · 0 评论 -
nyoj 36
//这一题是 nyoj 36 是一道求最长公共子序列的题,也是用dp做出来的核心代码也就是一句,题目大概思路是先找到两组字符串里面相同的字母在二维数组里面更新每次比较过后dp的值,空想很难理解,自己在纸上画画就知道了实在不行就把那段代码记下来。。。还有我一直都不明白为什么我把dp数组放在主函数和while里面编译不过,而且我一直都怀疑二维数组没赋初值,可以显示初始值,那还要原创 2014-12-11 14:38:37 · 378 阅读 · 0 评论 -
背包问题小结
#include #include using namespace std;int main(){ int i,j,n,m,v,c[100100],w[100100],cnt[50001]; cin>>n; while(n--) { cin>>m>>v; for(i=1;i<=m;i++)原创 2014-12-10 23:00:57 · 412 阅读 · 0 评论 -
nyoj 37
//nyoj 37 代码有点乱,和最长公共子序列很像,只是多加了一个数组,之前调用函数,一直超时,可是我看了下,为什么用一个整形数组存放倒置字符串竟然可以AC,我测试了下数据,打印出来的是一串地址,为什么为什么为什么啊。。。。#include #include #define Max(a,b) a>b?a:busing namespace std;int dp[100原创 2014-12-11 12:35:33 · 484 阅读 · 0 评论 -
hdu 1087
hdu 1087这道题是用dp做出来的,也算是很巧妙的方法。。。。思路:首先第一个for遍历1-n,这个时候先设一个flag=0然后在遍历从1到i,因为题目求得是单调最长序列的和所以j每次都要在i前面,然后在满足啊a[i]>a[j]的情况下用flag记下j前面序列和的最大值,在遍历完j后此时flag存储了1-j中最大的sum和,此时,只要一步把a[i]加上,就可以表示s原创 2014-12-11 14:54:34 · 479 阅读 · 0 评论 -
HDU5303
题意:给定一个环形道路长度为L,以及环形道路下标为0处为起始点,在环形道路上距离起始点Xi位置种植一颗苹果树,该树有a个苹果,篮子的最大容量为K,那么求摘完全部苹果所需的最短距离。思路:之前没想出来,根据官方题解,大致就是分成两个阶段来求,首先,按照普通情况下,肯定是每次都取离自己最短的苹果,这样因为要避免绕过半圈后的多余路径,就是分成两个半圈来走,分别贪心左右半圈,然后可能存在最后剩下的原创 2015-07-24 12:05:17 · 919 阅读 · 0 评论