
DP
文章平均质量分 78
还有多远
这个作者很懒,什么都没留下…
展开
-
删除部分字符使字符串对称
给定一个字符串和最多能进行删除操作的次数,怎样用最少的删除操作才能使该字符串对称(这也使结果字符串变的最长了),即成为palindrome?例如一个字符串s = "abcbdda",我们可以删除"dd"获得"abcbdda"使得s变为palindrome很容易想到DFS(回溯)的方法:(1)从左边i和右边j同时扫描字符串,直到两个指针相遇或出现两字符不同,即i >= j || s[i]原创 2014-06-03 20:31:06 · 1443 阅读 · 0 评论 -
POJ-2955(DP)
一开始想的状态方程是f[i][j] = max(f[i][j-1], f[i原创 2014-07-10 09:03:29 · 461 阅读 · 0 评论 -
POJ-2823(ST算法 + 滚动数组)
ST算法是求解RMQ问题最有效的方法之一,核心思想是原创 2014-06-23 00:53:05 · 680 阅读 · 0 评论 -
POJ-1949(DAG最长路径)
题目:http://poj.org/problem?id=1949所有任务合起来构成一个DAG,因为任务可以并行,所以从无前驱的节点到无后继的节点的所有任务路径中,最耗时的那一条就是所需要的总时间,因为这样的搜索中已经考虑了一个任务所有可能的开始时间。#include #include #include using namespace std;int N, c[100原创 2014-12-02 11:22:05 · 2063 阅读 · 0 评论 -
HDOJ-4276(树形DP+背包DP)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4276好久没有1A过树形DP了,真是开森呢~~~因为结构是树,所以从1到N肯定会经过最短路径,冗余的时间才能去访问别的节点(并返回最短路径上的节点!!!),因此我选择将这条必然经过的最短路径分离出来,对每个关键节点进行属性DP,再对这条关键路径进行背包DP,具体分析见代码注释。#includ原创 2015-01-13 00:45:24 · 496 阅读 · 0 评论 -
POJ-1976(DP)
题目:http://poj.org/problem?id=1976令dp(i, j)表示有i个火车头和j个车厢可以拉的最多人数,则对于最后一个车厢j进行分类讨论,则状态转移为dp(i, j) = dp(i-1, j-M) + sum[j]-sum[j-M] //如果拉jdp(i, j) = dp(i, j-1) //如果不拉j#include #include原创 2015-01-13 02:07:10 · 504 阅读 · 0 评论 -
ZOJ-3626(树形DP)
题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4772容易想到用dp[x][t]表示一开始位于x节点且拥有t天的时间最多能获得多少treasure,并保证第t天我们回到x这个起点,接着怎么dp呢,对于和x相距d的子节点y,我们有:如果2d > t,即从x出发不能在截止时间前返回,则我们不能选择去y;否则,我们原创 2014-12-14 11:44:39 · 407 阅读 · 0 评论 -
POJ-2264(DP + 保存路径)
题目:http://poj.org/problem?id=2264一开始都忘了保存DP路径了,瞎想了N久,通过这题复习LCS动态规划的同时,也回顾了打印DP路径的方法,好题#include #include #include using namespace std;#define MAX_LEN 108const int HORIZONAL = 1;const in原创 2015-02-21 21:07:38 · 586 阅读 · 0 评论 -
LeetCode--Best Time to Buy and Sell Stock IV(DP + 滚动数组)
题目:https://oj.leetcode.com/problems/best-time-to-buy-and-sell-stock-iv/原创 2015-03-02 11:11:46 · 1617 阅读 · 0 评论 -
ZOJ-3791(组合数学)
刚开始把题目看错了,以为是这样的:两个长度为n仅由0和1构成的字符串s1和s2,每次翻转可以改变s1的一个位置,问有几种方式能将s1经过k次翻转变为s2,仅能且必须改变s1的m个位置,还做了分析:(0)如果k = m;(1)现在k >= m,考虑两者的不同,假设有d处不同,n-d处相同,则显然至少需要翻转d个位置每个位置1次,才能将s1变为s2,如果m = d 且k >= d,翻转这d处不原创 2015-03-05 16:27:53 · 472 阅读 · 0 评论 -
POJ-3734(DP + 矩阵求幂)
题目:http://poj.org/problem?id=3734刚开始看到题目N分析:我们更多的关心红色和绿色的情况,限制条件是两者个数都是偶数,但子问题却可能出现两者一奇一偶、一偶一奇、两奇的情况,假设已经给n个块染色,且出现这4种情况的场面分别有{a, b, c, d}个,给第n+1个块染色之后可能构成的场面和数量分别为{m, n, p, q},我们来看两者是不是有一定的关系:1原创 2015-03-05 19:22:14 · 479 阅读 · 0 评论 -
POJ-1973(并行DP)
题目:http://poj.org/problem?id=1973一开始根本没想到是DP,看了discuss之后才明白,学来的思路也记录一下吧。题目中最迷惑的是时间,怎么个并行法,可以这么理解:对于n个人进行工作,设置一定的时限T,则给前n-1个人分配的时间是T,给最后一个人分配的时间也是T,这两个时间上没有加减的关系,所以第n个人可以选择以一部分时间去做A类工作,一部分时间去做B类工作。原创 2015-03-06 21:39:37 · 907 阅读 · 0 评论 -
POJ-2193(DP)
题目:http://poj.org/problem?id=2193分析:数位DP,很容易想到如果令f(n, m)表示从m个数中选择n个使之满足后一个是前一个至少2倍的关系,则对于数m,我们有两种操作:(1)选择m,则我们还要从1~m/2中选择n-1个数(2)不选m,则我们可以从1~m-1中选择n个数另外,当n=1时,显然有m种序列,从而有f(n, m) = f(n-1, m/2)原创 2015-03-09 20:52:15 · 536 阅读 · 0 评论 -
CarrerCup-多叉树上的最长连续路径
今天在CarrerCup上看到了一个问题,好像还没有好的答复,感觉可以用树形DP来做。题目连接:http://www.careercup.com/question?id=6285363834257408问题原文:in a tree any root can have any number of children. Every node has an integer value. Find原创 2015-03-10 18:31:10 · 1573 阅读 · 0 评论 -
POJ-1297(DP + 滚动数组)
题目:http://poj.org/problem?id=1297分析:依次用每个在清单上的物品去更新购买清单前i个物品所需要的最小花费。#include #include #include using namespace std;#define MAX_M 105#define MAX_N 100005int M, N;int kind[MAX_M];doubl原创 2015-03-24 00:35:35 · 460 阅读 · 0 评论 -
最长公共子字符串(动态规划)
和经典DP最长公共子串(不要求字符连续)不同,最长公共子字符串要求字符是连续的class LongestSubstring {public: int findLongest(string A, int n, string B, int m) { //f[i][j] represent the longest common substring starting wi原创 2015-08-06 01:02:02 · 419 阅读 · 0 评论 -
最小编辑代价(动态规划)
在nowcoder上的题目,原题如下:对于两个字符串A和B,我们需要进行插入、删除和修改操作将A串变为B串,定义c0,c1,c2分别为三种操作的代价,请设计一个高效算法,求出将A串变为B串所需要的最少代价。给定两个字符串A和B,及它们的长度和三种操作代价,请返回将A串变为B串所需要的最小代价。保证两串长度均小于等于300,且三种代价值均小于等于100。测试样例:原创 2015-08-06 01:06:58 · 1196 阅读 · 0 评论 -
POJ-1159(添加一些字符使得字符串对称)(DP+滚动数组)
最早写过一篇博客,删除部分字符使字符串对称,这题是添加部分字符使字符串对称,原创 2014-07-09 23:19:22 · 527 阅读 · 0 评论 -
HDOJ-1561(树形DP)
一开始感觉这是个森林,怎么DP,突然想到,可以用一个原创 2014-07-07 16:09:26 · 527 阅读 · 0 评论 -
POJ-2019(二维RMQ + 滚动数组)
先逐列求出没原创 2014-06-24 00:11:51 · 518 阅读 · 0 评论 -
POJ-3276(异或DP)
#include int N, K, M;char s[5000] = {0};/* initial state, 'F' 0, 'B' 1 */char pre[5000] = {0};/* whether i should be flipped by flips in front */char post[5000] = {0};/* post[i] whether to sta原创 2014-07-16 10:40:39 · 418 阅读 · 0 评论 -
POJ-3267(DP)
看了discuss才写出来的,唉,水平还是很di原创 2014-07-16 13:19:10 · 401 阅读 · 0 评论 -
POJ-1949(模拟或DP)
实际上类似银行多窗口服务,首先服务没有先决原创 2014-06-08 21:19:43 · 521 阅读 · 0 评论 -
POJ-2184(背包 + 动态数组,给交流电加个直流偏执)
这道题WA了N次终于A了,看了Discuss也原创 2014-07-20 23:30:51 · 748 阅读 · 0 评论 -
POJ-1015(离散化DP)
题目要求|D(J)-P(J)|最小,但|D(J)-P(J)|显然不符合最优子结构,不能直接动态规划,但题目中说要使|D(J)-P(J)|最小时的D(J)+P(J)最大化,我们知道D(J)+P(J)是符合最优子结构的要是只用让D(J)+P(J)最大,那就是一个0-1背包问题了,想着要是能将D(J)-P(J)作为一个维度,有一定的范围,再对D(J)+P(J)动态规划的话就好了令f(i,j,原创 2014-06-29 22:54:31 · 588 阅读 · 0 评论 -
POJ-1018(DP+滚动数组)
这道题本来想用map保存price所能达到的最大bandwidth,各种TLE之后看了discuss,原创 2014-06-29 16:25:53 · 509 阅读 · 0 评论 -
POJ-1157(边输入边DP || 滚动数组)
用dp[i][j]表示将flower i放在vase j中这个状态所能达到的最大原创 2014-06-29 20:01:43 · 432 阅读 · 0 评论 -
POJ-2385(DP)
#include #define max(a,b) ((a) > (b) ? (a) : (b))#define MAX_T 1000#define MAX_W 30int T, W, id[MAX_T+1];int dp[MAX_T+1][MAX_W+1][2] = {0};int main(){ int i, t, w, turning; while(sca原创 2014-06-09 01:39:31 · 452 阅读 · 0 评论 -
POJ-2063(完全背包)
由于债券价格都是1000的倍数,所以计算时可以先将钱和价格原创 2014-06-12 01:39:51 · 436 阅读 · 0 评论 -
POJ-1276(多重背包)
典型多重背包,和经典问题的不同在于原创 2014-06-12 19:20:06 · 631 阅读 · 0 评论 -
HDOJ-4341(分组DP)
经典的分组DP题:因为同一条直线上的原创 2014-06-11 23:16:16 · 495 阅读 · 0 评论 -
解码数字序列
问题:指定26个字符的编码方式原创 2014-07-25 13:51:34 · 709 阅读 · 0 评论 -
POJ-1742(多重背包)
复习一下多重背包的二进制分解、0-1背包的逆推、原创 2014-07-25 01:41:06 · 438 阅读 · 0 评论 -
HDOJ-1011(树形DP)
一开始没有注意到的细节:我们必须先攻克父原创 2014-07-07 14:46:48 · 555 阅读 · 0 评论 -
POJ-3345(树形DP)
#include #include #include #include #include #include using namespace std;#define INF 999999999int N, M;map nameIdMap; //node name index mapvector domination[201]; //domination names of each node原创 2014-07-07 23:12:17 · 495 阅读 · 0 评论 -
POJ-1321(类8皇后问题)
题目:http://poj.org/problem?id=1321分析:题目数据量很小暴搜即可#include int n, k, tot;char board[10][10];void dfs(int x, int r, int u){ if(!x){ ++tot; return; } if(r >= n) return; //try to plac原创 2016-01-12 00:56:59 · 368 阅读 · 0 评论