动态规划
文章平均质量分 69
fu_ding1991
勿忘初心,方得始终
展开
-
POJ 1276--Cash Machine
较为简单的背包DP。 设dp[i][j] = 1,到第i种钞票能形成cash j,否则为0. 则很容易得出转移方程,若dp[i][j] = 1,则dp[i+1][j+k*d[i+1]] = 1, 其中k在[0,n[i+1]]之间,n[i+1]为第i中钞票数量,d[i]为其面额。若直接 暴力计算复杂度为N*M*n。 很容易想到若直接枚举i中的j与k个d[i+1]的和,有原创 2014-07-26 14:06:34 · 480 阅读 · 0 评论 -
POJ 3280--Cheapest Palindrome
题意:给定一字符串,可以在任何位置删除或者添加字符,使得字符串变为回文字符。但是每次操作的代价不同,问最小的代价。题解:类似于POJ 1159。因为从a[i]到a[j]的子串变成的最少代价回文字符串头尾是a[i]或者a[j]或者都不是。设dp[i][j]为从a[i]到a[j]组成的子串变成回文字符串的最小花费。转移方程:如果 a[i] = a[j] ,dp[i][j] = dp[i原创 2014-12-02 11:29:57 · 351 阅读 · 0 评论 -
POJ 1947--Rebuilding Roads
题意:给定一规模为N的树,问至少去掉多少条边能得到一个规模为P的子树。题解:看了一些大牛的题解,很困惑纠结一些问题。最佳答案是否是包括整棵树根节点的一颗子树,动态规划定义时的状态是否是包括子树根节点的解。对于第一个可以很容易举出反例:4 11 21 42 3其代价为1的子树只含有节点3,不包括根节点1。所以最佳子树不一定包括整棵树根节点。对于第二个问题,原创 2014-12-13 17:45:46 · 366 阅读 · 0 评论 -
Code Jam-- New Lottery Game
原题:https://code.google.com/codejam/contest/dashboard?c=2994486#s=p1题意:给定三个10^9以内的数A,B,K,问有多少个数对在x 题解:解题的基础在于求一个小于K的数的个数DP上。IsLessA为1代表已形成比特位前缀小于A的比特位前缀,为0代表前缀相等,其它详见注释。#include#include#inc原创 2015-01-20 15:27:14 · 463 阅读 · 0 评论 -
Facebook Hacker Cup 2015 Round 1--Corporate Gifting(树形动态规划)
原题:https://www.facebook.com/hackercup/problems.php?pid=759650454070547&round=344496159068801题意:给定一颗有根树,在树上下层的节点要给上层节点礼物,根节点的礼物则给慈善会,但是给礼物有个条件就是你不能送你的父节点已经送出的礼物。问满足要求的最少花费。 题解:这个题卡了一段时间,类似于染色问题,可以用树形动态原创 2015-03-14 22:17:12 · 922 阅读 · 0 评论 -
Facebook Hacker Cup 2015 Round 1--Homework(筛选法求素数)
题意:给定A,B,K(A<=B)三个数,问在[A,B]范围内的数素数因子个数为K的个数。 题解:典型的筛选法求素数。首先建立一个保存素数因子个数的数组factorNum[],以及到n为止含有素数因子个数为k的二维数组sumNum[n][k]。 factorNum可以由筛选法确定,初始化数组为0。 1. 从小到大遍历给定最大范围内的数,若遍历到数n时,factorNum[n]=0则说明这个数是原创 2015-03-14 13:24:46 · 699 阅读 · 0 评论 -
Facebook Hacker Cup 2015 Round 1--Winning at Sports(动态规划)
原题:https://www.facebook.com/hackercup/problems.php?pid=688426044611322&round=344496159068801题意:你和一个朋友玩足球游戏,分数从0-0开始,最终你总是赢,并且你主要有两种方式赢,第一种stressFree方式你肯定要进第一个球并且总是比你的朋友分数高,第二种stressFull方式除了你的朋友达到最终分数时,原创 2015-03-14 20:59:37 · 1022 阅读 · 0 评论 -
POJ 1050-To the Max(最大子矩阵和)
题意:给定一个二维矩阵,求它子矩阵的最大和。 题解:首先我们从一维数组出发,给定一个一维数组a[],求它的最大连续子数组和。 易知使用动态规划,设dp[i]为以a[i]结尾的最大子数组和。 转移方程:若dp[i] > 0,则dp[i+1] = dp[i]+a[i+1]。若dp[i] <= 0, 则dp[i+1] = a[i+1]。一维的如上求解,然后我们试着将二维的转化成一维,我们将子矩原创 2015-05-12 15:31:43 · 493 阅读 · 0 评论 -
Best Time to Buy and Sell Stock IV(动态规划)
题意:有一支股票每天的价格波动,请在给定的时间内完成k次交易使收益最大,一次交易代表买入再卖出,交易不能重叠(必须卖完之后在买)。题解:我们首先设global[i][j]为到第i天位置交易j次的最大收益。 因为最后一次交易要么在第i天卖出,要么在之前卖出。在之前卖出的最大收益显然是global[i-1][j],而要求第i天卖出的最大收益我们需要枚举在前面哪一天买进。可以得到转移方程: globa原创 2015-05-27 10:44:06 · 457 阅读 · 0 评论 -
Palindrome Partitioning&II(回文字符串)
题意:找出一个字符串中的所有切割使得切割后的子串都是回文字符串。首先想到一个简单的DP判断从i到j是否能组成回文。 设dp[i][j] = 1代表a[i]到a[j]组成的子串是回文,反之则不是。 转移方程:若dp[i+1][j-1] = 1且a[i] = a[j]则dp[i][j] = 1。 然后寻找所有切割可以使用DFS,深搜每个可能的分割。代码如下:class Solution {pub原创 2015-05-26 11:54:11 · 370 阅读 · 0 评论 -
Shortest Palindrome(KMP)
题意:Given a string S, you are allowed to convert it to a palindrome by adding characters in front of it. Find and return the shortest palindrome you can find by performing this transformation.For exampl原创 2015-05-27 15:18:55 · 618 阅读 · 0 评论 -
Interleaving String(动态规划求字符重构)
题意:Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.For example, Given: s1 = “aabcc”, s2 = “dbbca”,When s3 = “aadbbcbcac”, return true. When s3 = “aadbbbaccc”, return fa原创 2015-05-28 15:10:25 · 502 阅读 · 0 评论 -
Binary Tree Maximum Path Sum(树形动态规划)
题意:Given a binary tree, find the maximum path sum.The path may start and end at any node in the tree.For example: Given the below binary tree, 1 / \ 2 3Return 6.题解:设dp[root]为从root一直往下走的最大和,设最大原创 2015-05-28 15:47:38 · 552 阅读 · 0 评论 -
POJ 2486--Apple Tree
题意:有一颗苹果树,每个节点有一些苹果,问从根节点出发走K步最多能吃到多少苹果。题解:树形DP,状态转移较为复杂,具体可参考注释。#include#include#include#includeusing namespace std;class solve{private: vector > sons; char* vis; int** dp原创 2014-12-16 11:11:56 · 356 阅读 · 0 评论 -
POJ 1191--棋盘分割
题意:给定一8*8的棋盘,每次沿着边原创 2014-11-24 20:30:38 · 451 阅读 · 0 评论 -
POJ 3373--Changing Digits
题意:给定一原创 2014-11-23 13:25:23 · 454 阅读 · 0 评论 -
POJ 1321--棋盘问题
DFS:16ms首先枚举从n行中选择cheeseNum个行的个数,也就是选择棋子的过程中第一行 必须是[0,n-cheeseNum]之间,DFS过程中第二行的开始行数就必须在第一行基 础上加1,同时能有棋子的第二行的最大行数加1。当最大行数为n时,也即是 DFS了cheeseNum层,并且列数无冲突时,结果加一。原创 2014-07-26 17:53:03 · 414 阅读 · 0 评论 -
POJ 2151--Check the difficulty of problem
概率DP,proba[i][j]:前i个题目解出j道的概率。根据此列出状态转移方程:proba[i][j] = proba[i-1][j-1]*p[i]+proba[i-1][j](1-p[i]).其中p[i]代表解出第i个题目的概率。 题目求:每个队解出至少一个题目,其中冠军(解出最多题目的队伍)解出至少N个题目。 将以上事件分为A,B。 则P(AB) = P(A)-P原创 2014-07-26 18:20:45 · 408 阅读 · 0 评论 -
POJ 1159--Palindrome(回文序列)
题目要求对于一序列zhishao加上多上字符能组成一个会原创 2014-08-04 19:53:14 · 453 阅读 · 0 评论 -
POJ 3267--The Cow Lexicon
根据题意,可以得到一个动态方程:设dp[i]为co原创 2014-08-05 16:55:43 · 376 阅读 · 0 评论 -
POJ 1836--Alignment(LIS,LCS)
题意:要求一给定序列的子序列,使其中的元素至少能原创 2014-07-30 15:29:19 · 638 阅读 · 2 评论 -
POJ 1080--Human Gene Function
本题DP方案类似于LCS的DP设计。考虑到liangg原创 2014-08-05 19:45:51 · 295 阅读 · 0 评论 -
POJ 2533--Longest Ordered Subsequence
纯粹的LIS,参见1836#include#include#includeusing namespace std;#define maxN 1002int findLen(short* x,int left,int right,short val){ int mid; while(left <= right) { mid = (le原创 2014-07-31 18:01:15 · 339 阅读 · 0 评论 -
POJ 1260--Pearls
DP问题:首先想到了一个原创 2014-07-31 17:27:03 · 345 阅读 · 0 评论 -
POJ 3176--Cow Bowling
经典的DP题目,原创 2014-08-01 14:55:34 · 368 阅读 · 0 评论 -
POJ 3264--Balanced Lineup(RMQ问题)
题意:给定一数组,原创 2014-11-04 15:27:01 · 2342 阅读 · 5 评论 -
POJ 3368--Frequent values
题意:给定一不减数组,原创 2014-11-04 15:56:06 · 297 阅读 · 0 评论 -
POJ 3254--Corn Field
题意:又是farmer john和他的牛,给定一个M*N的玉米地,有的点上有玉米,有的则没有,问把这些牛放在有玉米的点上且不相邻总共有多少种方法,牛的个数可以放0个,1个以及一个图上不相邻点的最大团都可以。题解:动态规划。设num[i][j]为从第1行到第i行为止第i行放置状态为j的总方法。j的二进制位代表1行N列的牛的方法。易知第i+1行可行的方法只跟第i行的方法有关,设第i行的原创 2014-11-26 17:08:26 · 394 阅读 · 0 评论 -
Maximal Rectangle(最大矩阵)
题意:Given a 2D binary matrix filled with 0’s and 1’s, find the largest rectangle containing all ones and return its area. 题解:类似于求最大子矩阵和,可以将i到j行压缩为1行,而一行的最长连续1就是我们要求的矩形的宽度。代码如下:class Solution {public:原创 2015-05-28 16:19:46 · 474 阅读 · 0 评论