动态规划
xindoo
10年技术博主,博客专家,曾就职于阿里 小米,目前任贝壳资深工程师。拥有运维、搜索广告、后端业务相关工作经验,擅长Java、Lniux、Redis……
展开
-
poj 1976 A Mini Locomotive(01背包)
题目链接DescriptionA train has a locomotive that pulls the train with its many passenger coaches. If the locomotive breaks down, there is no way to pull the train. Therefore, the office of railroa原创 2013-04-12 16:28:43 · 1445 阅读 · 0 评论 -
poj 1159 Palindrome(最长公共子串)
大概题意就是求最少添加多少个字符可以把长度为N的字符串编程回文串。则需要最少需要补充的字母数 = 原序列S的长度 — S和S'的最长公共子串长度S'为原串的逆串。关于求最长公共子串, 用到的是动态规划伪代码如下if( i ==0 || j == 0 ) { MaxLen(i, j) = 0 //两个空串的最长公共子序列长度当然是0}原创 2013-05-30 20:08:51 · 1248 阅读 · 0 评论 -
100个经典的动态规划方程
1.资源问题1-----机器分配问题F[I,j] = max(f[i-1,k]+w[i,j-k]) 2.资源问题2------01背包问题F[I,j] = max(f[i-1,j-v]+w,f[i-1,j]); 3.线性动态规划1-----朴素最长非降子序列F = max{f[j]+1} 4.剖分问题1-----石子合并F[i,j] = min(f[i,k原创 2013-06-03 10:19:20 · 4588 阅读 · 0 评论 -
poj 1050 To the Max(最大子矩阵之和)
http://poj.org/problem?id=1050 我们已经知道求最大子段和的dp算法 参考 here 也可参考编程之美有关最大子矩阵和部分。 然后将这个扩大到二维就是这道题。顺便说一下,有时候不要把问题想复杂了,有些问题只能靠暴力求解,而这道题是暴力加算法。 在这个题中,我们可以把二维压缩到一维然后求解最大子段。我们先枚举所求矩阵的起点行和原创 2013-06-26 10:33:56 · 1560 阅读 · 0 评论 -
poj 1164 放苹果
http://poj.org/problem?id=1664 这题可以用递归的方式做,想给第一个盘子里放上苹果从(0到m),然后给第二个放上,为了保证每次产生的放法是不同的,第二个里面放置的苹果不能从0开始,否则就会产生相同的放法,然后同理第三第四个盘子。。。。 还有一个问题,可能放到最后一个盘子了,还有很多苹果没有放,怎么办?? 都放最后一个里面?? 其实不是,这样的话可能和原创 2013-06-27 14:49:53 · 1646 阅读 · 0 评论 -
hdoj 2089 不要62
这题数据量相对比较小,可以暴力打表解决。不过我这里用数位dp 刚开始学数位dp,参考了别人的代码。//2013-06-27-15.30#include #include int dp[7][3];//dp[i][0] 表示不存在不吉利的数字//dp[i][1] 表示不存在不吉利的数字,且最高位是2//dp[i][2] 表示存在不吉利的数字int bit[10];void原创 2013-06-27 15:42:58 · 1707 阅读 · 0 评论 -
hdoj 3555 BOMB(数位dp)
//hdoj 3555//2013-06-27-16.53#include #include __int64 dp[21][3], n;int len, bit[21];//dp[i][0] 长度为i 包含49的个数//dp[i][1] 长度为i没有49但以9开头的//dp[i][2] 长度为i 没有49void init(){ dp[0][2] = 1;原创 2013-06-27 17:00:18 · 1254 阅读 · 0 评论 -
poj dp 合集
1015 Jury Compromise1029 False coin1036 Gangsters1037 A decorative fence1038 Bugs Integrated, Inc.1042 Gone Fishing1050 To the Max原创 2013-04-19 09:45:15 · 2360 阅读 · 0 评论 -
light oj 1159 - Batman LCS
学过简单动态规划的人应该对最长公共子序列的问题很熟悉了,这道题只不过多加了一条字符串变成三条了,还记得,只要把状态变成三维的即可。//http://lightoj.com/volume_showproblem.php?problem=1159//2013-08-15-09.50#include #include #include #include using namespace原创 2013-08-15 15:20:54 · 1601 阅读 · 0 评论 -
动态规划详解
其实根本就谈不上详解,应该说只是随便谈谈,真正能详解动态规划的又有几个人,所以,这个标题略显扯淡。 前段时间一直在做关于数据结构的题,也算是对数据结构有了一定的了解,知道了有些数据结构的基本算法。现在刚刚开始接触动态规划,其实写这篇文章的初衷是一来锻炼一下自己的总结能力,二来也是希望通过这篇文章,来指引和我一样的初学者,废话不多说了,开始吧。一、01背包 我最开始接原创 2013-04-19 22:19:00 · 2352 阅读 · 4 评论 -
Leetcode 377. Combination Sum IV
题目链接:Combination Sum IVGiven an integer array with all positive numbers and no duplicates, find the number of possible combinations that add up to a positive integer target. 赤裸裸的完全背包,属于动态规划的范畴,大家有原创 2016-07-27 20:44:39 · 1965 阅读 · 0 评论 -
Leetcode 53.Maximum Subarray
题目链接:53.Maximum Subarray Find the contiguous subarray within an array (containing at least one number) which has the largest sum. For example, given the array [−2,1,−3,4,−1,2,1,−5,4],the contiguous原创 2016-08-07 16:41:09 · 1455 阅读 · 0 评论 -
Leetcode 368. Largest Divisible Subset思路及详解
题目链接:368. Largest Divisible SubsetGiven a set of distinct positive integers, find the largest subset such that every pair (Si, Sj) of elements in this subset satisfies: Si % Sj = 0 or Sj % Si = 0. If原创 2016-11-05 17:58:18 · 2128 阅读 · 0 评论 -
Leetcode 467. Unique Substrings in Wraparound String
题目链接:Unique Substrings in Wraparound String Consider the string s to be the infinite wraparound string of “abcdefghijklmnopqrstuvwxyz”, so s will look like this: “…zabcdefghijklmnopqrstuvwxyzabcdefghi原创 2016-12-10 19:22:18 · 1605 阅读 · 0 评论 -
light oj 1231-1232 - 1233- Coin Change 背包
题目链接In a strange shop there are n types of coins of value A1, A2 ... An. C1, C2, ... Cn denote the number of coins of value A1, A2 ... An respectively. You have to find the number of ways you ca原创 2013-04-22 19:15:28 · 2360 阅读 · 0 评论 -
uva 10891 game of sum
题目链接详细请参考刘汝佳《算法竞赛入门经典训练指南》 p67//2013-05-01-20.40//uva 10891#include #include #include using namespace std;const int maxn = 105;bool vis[maxn][maxn];int s[maxn];int d[maxn][maxn];int dp原创 2013-05-27 20:56:18 · 1400 阅读 · 0 评论 -
poj 3624 Charm Bracelet(简单01背包)
题目链接DescriptionBessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd like to fill it with the best charms possible from the N (1 ≤ N ≤ 3,402) available charm原创 2013-04-12 16:54:12 · 1418 阅读 · 0 评论 -
hdoj 2191 背包
题目链接 虽然每件物品的数目并不是1,可能有多个,但我们完全可以把这个题目转化成01背包来解决。 可以把多件相同的物品合并成一件,马上就变01背包了。#include #include #include using namespace std;int dp[105];int pr[105];int cnt[105];int w[105];int main()原创 2013-04-23 20:01:42 · 1270 阅读 · 0 评论 -
hdoj 3466 Proud Merchants(01背包)
题目链接 这并不是一题裸的01背包,它在简单到01背包上还加了一个限制条件Q,如果没有Q,这完全是一题裸01背包。 对于这个题目,我们只要加上排序对某些物品进行优先处理就好了。 想想我们为什么要排序, 举个简单的例子,如果数据中出现这样到情况 5 9 3、 6 6 5、5 6 3…… 对5 9 3 处理的时候他只能求出dp[9]然后6 6 5只能在dp[9]的原创 2013-04-24 09:00:01 · 1433 阅读 · 1 评论 -
poj 1088 记忆化搜索||动态规划
poj 1088 记忆化搜索也也是采用递归深搜的对数据进行搜索,但不同于直接深搜的方式,记忆化搜索是在每次搜索时将得到的结果保存下来,避免了重复计算,这就是所谓的记忆化。记忆化应该是属于动态规划。 举个例子,比如我们搜索最长最长连续增子序列, 1 2 3 4 5 6 7, 当然这个例子比较特殊,但足以说明情况。 对于这种问题,我们可以先搜索以1开始的原创 2013-04-18 14:01:03 · 2047 阅读 · 0 评论 -
hdoj 1520 Anniversary party(树形dp)
题目链接 按照等级我们可以建一颗树,如图 我们可以把一个节点当做一个人,每个节点都有一个权重。按照题目意思,如果我们取了某个节点,那么他的父节点和子节点都是不能取的。按要求选取节点,使得选取节点的权重和最大。 DP,用no表示不选择i点时,i点及其子树能选出的最多人数,is表示选择i点时,i点及其子树的权值和最大。状态转移方程:对于叶子节点原创 2013-04-26 15:40:40 · 1388 阅读 · 0 评论 -
light oj 1047 - Neighbor House 动态规划
题目链接The people of Mohammadpur have decided to paint each of their houses red, green, or blue. They've also decided that no two neighboring houses will be painted the same color. The neighbors of hou原创 2013-04-22 08:27:08 · 2249 阅读 · 0 评论 -
hdoj 1028/poj 2704 Pascal's Travels(记忆化搜索||dp)
题目链接题意 有个小球,只能向右边或下边滚动,而且它下一步滚动的步数是它在当前点上的数字,如果是0表示进入一个死胡同。求它从左上角到右下角到路径数目。注意, 题目给了提示了,要用64位的整数。记忆化搜索方法#include #include #define ll __int64int n;ll vis[36][36];char board[36][36原创 2013-04-29 14:24:39 · 1553 阅读 · 0 评论 -
poj 2479 Maximum sum(求最大子段和的延伸)
题目链接题意: 题目的大概意思是把数组分成不交两段,分别求出两段的最大子段和s1和s2,然后求出最大的s1+s2。不知道最大子段和的点这 here思路: 看完最大连续子段和 的 dp算法 这个很容易理解,我用dplift[i]保存第1到第i个之间的最大子段和,dpright[i]保存第i到第n个之间的最大子段和,最终结果就是dplift[i]+d原创 2013-05-01 17:47:07 · 3834 阅读 · 0 评论 -
求最大连续子段和 的 dp算法
问题描述: 有n个数(以下都视为整数,浮点的也一样),每个数有正有负,现在要在n个数中选取相邻的一段,使其和最大,输出最大的和。问题分析: 对于这样的问题,我们可以直接用暴力,一个双重循环,虽说可以,但也没有更高明的方法? 我们再分析这个问题,如果我们知道了某个数前面一段数的和,我们就该考虑把这个数加入到前一段,还是重新开始一段。这个地方很重要,如果前一段的原创 2013-05-01 17:32:21 · 3567 阅读 · 0 评论 -
hdoj 1176免费馅饼(dp)
题目链接//2013-05-17-21.08#include #include #include using namespace std;const int maxn = 100004;int dp[maxn][12];int main(){ int n, maxt, t, x; int tmax; while(scanf("%d", &n)原创 2013-05-17 21:06:42 · 1114 阅读 · 0 评论 -
light oj 1005 - Rooks(组合数学)
题目链接题意:在一个n*n的棋盘上放m个车,使得各个车之间不相互攻击。有多少种放法?组合数学解法 现在n行中选出m行,C(n,m),再在n列中选出m列随便放A(n,m),答案为C(n,m)*A(n,m)。#include #include typedef __int64 LL;LL A(int n, int m){ LL ans = 1;原创 2013-05-06 20:28:59 · 2052 阅读 · 1 评论 -
poj 3254 Corn Fields (状态压缩dp)
题目链接题意:Farmer John 放牧cow,有些草地上的草是不能吃的,用0表示,然后规定两头牛不能相邻放牧。问你有多少种放牧方法。 状态压缩dp其实就是用二进制来表示所有的状态,比如这题, 我们在某一行可以这样取0 1 0 1 1 0 1,用1代表取了,0代表没取,因为这点,它的数据量也限制在20以内,所有看到这样数据量的题目可以先考虑一下状态压缩dp。对于有多原创 2013-05-07 20:21:17 · 1486 阅读 · 0 评论 -
poj 1185 炮兵阵地 (状态压缩dp)
题目链接 如果你是刚刚开始做状态压缩dp,我建议你先看看 poj 3254 Corn Fields 这是一道比这一题更简单,更容易入门的题目。 还有在代码中我用了一个很巧妙的方法求一个数二进制数中1的个数 具体请看我博客中 x& (x - 1)==0 这篇文章 链接 。 还有一点,不同于poj 3254的地方,我们不能直接枚举所有的状态。我在getr原创 2013-05-08 20:16:00 · 1485 阅读 · 0 评论 -
Leetcode 62. Unique Paths & 63. Unique Paths II
好久没刷题了,今天来俩道简单题。 Leetcode 62. Unique Paths Leetcode 63. Unique Paths IIA robot is located at the top-left corner of a m x n grid (marked ‘Start’ in the diagram below). The robot can only move either原创 2017-02-25 15:31:35 · 1503 阅读 · 0 评论