动态规划
文章平均质量分 56
_夜风
我好懒怎么办
展开
-
nyoj 17
// nyoj 17 代码如上,用的是dp,总的来说就是对一个字符串 从末尾开始比较,设定一个数组,存放每个单调字串的最大长度,最后比较。。。 //要注意的就是里面if语句对于每次字符比较后,更新数组,自己在纸上画画就清楚了。。。 #include #include using namespace std; int main() { int i,原创 2014-12-11 14:37:30 · 422 阅读 · 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 · 667 阅读 · 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 · 542 阅读 · 0 评论 -
ZOJ1524
题意:给定需要购买物品的顺序以及总物品对应的价格,求解按顺序购买物品时最小花费。 输入: m,n(m代表需要购买物品的清单,n代表总的物品数) Xi...(代表对应物品的序号以及价格) 输出: cost(最小花费,有精度要求) 思路:对于商品j,有购买和不购买两种选择,并且如果j序号正好和i匹配,说明是符合条件的,那么此时最小花费应是不买(dp[1][j])和购买(dp[0原创 2015-07-20 10:30:08 · 441 阅读 · 0 评论 -
ZOJ3161
朴素动态规划 ZOJ3161 题意:(严重标题党)老板不想让客人走,客人不想留,客人按顺序排好,老板抽8g(书上翻译成八卦,神翻译),抽到的 如果相邻,其中一个人由客人决定离开,求最后黑心的老板最多能让多少人留下。 输入: n(客人个数),m(8g关系对数) a(客人a),b(客人b)(m行) 输出: T(最多留下的人数) 思路:之前看题目原创 2015-07-16 16:19:11 · 565 阅读 · 0 评论 -
SGU131--NYOJ435
参考blog http://m.blog.csdn.net/blog/u012760629/36927465 http://www.cppblog.com/menrowitianya/archive/2014/06/23/207386.html sgu131 题意:给你一个n*m的矩形,可以填充1*2或者缺一角的2*2矩形,求填发? 输入: n,m(n,m 输出:原创 2015-07-17 19:59:35 · 513 阅读 · 0 评论 -
HDU3757
题意:一些团队因为任务要去避难所,并且每个避难所必须要有团队在,避难所的数量小于等于团队的数量, 团队去避难所的消耗油量与路程成正比,求解最小耗油量。题目来源:2010 Northeastern European Regional Contest 输入: T(示例) n(团队个数) a,b,c...(团队坐标,无序排列) m(避难所个数) a1,b1,c1...(避难所坐标,原创 2015-07-18 16:06:11 · 548 阅读 · 0 评论 -
ZOJ3527
题意:给你一个有向图,一共N个顶点,且每个顶点只有一个前驱或后继,在顶点上建立圣地,那么就可以获得一个信仰值,如果在这个顶点的后继节点上也建立圣地,那么将改变一定的信仰值,求解能获取的最大信仰值。 思路:好吧,这题一点思路都没有,本来题目就做的比别人少,树状DP什么的,更是少,这次要不是准备好好研究下DP问题,估计想都没想过去接触这种东西,只怪自己太懒了。题目是求最大值的,所以考虑要不要在这原创 2015-07-25 18:42:23 · 462 阅读 · 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 · 729 阅读 · 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 · 477 阅读 · 0 评论 -
单调最长递增子序列
// 再一次复习 最长单调递增子序列dp求法 // 以前有过一次专门的总结,现在有点忘了,拿出来看看 // 目前为止,我做过的这类题目就1.最长子序列和 2.字母和数字单调最长序列。。。后面继续总结 #include #include #include #include using namespace std; int main() { char原创 2014-12-11 12:46:59 · 384 阅读 · 0 评论 -
hdu 1003
这个是暴力枚举求解的 //hdu1003 这一题的代码我也不愿意整理了,乱就乱吧 这一道题已经写了至少五遍了,也没什么好说的了,核心代码就是第二个for那里 自己在纸上写写就清楚了,后面一个for找最大,然后依据这个最大的 可以推出是从哪里开始的,根据就是每次往回加一个 然后判断和是否等于最大的,在纸上写写就清楚了。。。。 #include #include u原创 2014-12-11 14:38:00 · 522 阅读 · 0 评论 -
nyoj 36
//这一题是 nyoj 36 是一道求最长公共子序列的题,也是用dp做出来的 核心代码也就是一句,题目大概思路是先找到两组字符串里面相同的字母 在二维数组里面更新每次比较过后dp的值,空想很难理解,自己在纸上画画就知道了 实在不行就把那段代码记下来。。。 还有我一直都不明白为什么我把dp数组放在主函数和while里面 编译不过,而且我一直都怀疑二维数组没赋初值,可以显示初始值,那还要原创 2014-12-11 14:38:37 · 379 阅读 · 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 · 414 阅读 · 0 评论 -
nyoj 37
//nyoj 37 代码有点乱,和最长公共子序列很像,只是多加了一个数组,之前调用函数, 一直超时,可是我看了下,为什么用一个整形数组存放倒置字符串 竟然可以AC,我测试了下数据,打印出来的是一串地址,为什么为什么为什么啊。。。。 #include #include #define Max(a,b) a>b?a:b using namespace std; int dp[100原创 2014-12-11 12:35:33 · 487 阅读 · 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 · 482 阅读 · 0 评论 -
HDU5303
题意:给定一个环形道路长度为L,以及环形道路下标为0处为起始点,在环形道路上距离起始点Xi位置种植一颗苹果树,该树有a个苹果,篮子的最大容量为K,那么求摘完全部苹果所需的最短距离。 思路:之前没想出来,根据官方题解,大致就是分成两个阶段来求,首先,按照普通情况下,肯定是每次都取离自己最短的苹果,这样因为要避免绕过半圈后的多余路径,就是分成两个半圈来走,分别贪心左右半圈,然后可能存在最后剩下的原创 2015-07-24 12:05:17 · 928 阅读 · 0 评论