DP
文章平均质量分 74
AC_Gibson
这个作者很懒,什么都没留下…
展开
-
最长公共子序列:HDU1159 Common Subsequence
最长公共子序列直接模板:#include #include #include #define MAX 1100using namespace std;char a[MAX],b[MAX];int dp[MAX][MAX];int main(){ int i,j; while(scanf("%s%s",a,b)!=-1) { int原创 2014-10-31 14:46:12 · 538 阅读 · 0 评论 -
HDU1249 三角形 递推
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1249分析:知道了直线和折线分割平面的情况这题就很简单了。我们知道,对于第i个三角形来说,其前面已经有了(i-1)个三角形==>有(3i-3)条边,对于第i个三角形,其每一条边最多能和之前的每个三角形的2条边有交点,即能和前面的(2i-2)条边各有一个交点,而这些交点会把第i个三角形的一条边原创 2015-06-03 21:27:38 · 1155 阅读 · 0 评论 -
FZU2129 子序列个数 DP
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2129题目大意:求一序列的不相同的子序列的个数。分析:注意区分子序列和子串的区别:子序列可以不连续,子串必须连续。先说说本题吧。我们用dp[ i ]来纪录以 前i个字符组成的序列 的不同子序列的个数,很显然,对于dp[ i+1 ],我们把dp[ i+1 ]=dp[ i ]×2+1,原创 2015-08-18 15:31:42 · 581 阅读 · 0 评论 -
HDU5492 Find a path DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5492题目大意:一个n*m的图,每个节点有一个不大于30的权值A,要从(1,1)点走到(n,m)点,每次只能向下或向右走,问表达式(n+m-1)*∑(Ai-Aave)^2最小是多少。分析:将表达式展开可以化简可得:(n+m-1)*∑Ai^2-(∑Ai)^2,我们用dp(i,j,k原创 2015-09-29 20:26:12 · 454 阅读 · 0 评论 -
最长上升子序列 O(n^2)算法和O(nlogn)算法
最长上升子序列问题(LIS问题) O(n^2)算法(DP)分析:对于一个数列的最长上升子序列,我们用一个数组dp[i]来纪录以a[i]结尾的子序列中的最长上升序列,那么很容易可以想到,对于第一个元素来说,他的dp[1]=1;对于后面的每个元素i,他的dp[i]应该是前面dp[]中最大的一个然后再加上1,即dp[i]=max(dp[j]) (j from 1 to i)原创 2014-10-15 14:12:35 · 834 阅读 · 0 评论 -
HDU1176 免费馅饼 DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1176题目大意:区间[0,10]上掉落馅饼,每秒在一个整数点上掉落一个馅饼,gameboy第0秒在位置5,他在第一秒只能接到4,5,6这三个位置上的馅饼,问你最多可以接到多少馅饼。分析:数塔问题。我们以时间为纵坐标,位置为横坐标建立一个矩阵,那么我们会发现,其实就是在(0,5)位原创 2015-10-19 14:18:09 · 422 阅读 · 0 评论 -
BZOJ1026 windy数 数位DP
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1026题目大意:windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,在A和B之间,包括A和B,总共有多少个windy数?分析:数位DP,定义dp(i,j)为高一位为j的i位数中满足题意的数的个数。原创 2015-10-20 19:39:04 · 996 阅读 · 0 评论 -
URAL1057 Amount of Degrees 数位DP
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1057题目大意:统计区间[x,y]内可以用k个不同的b进制数的和来表示的数的个数。分析:参考论文《浅谈数位类统计问题》。我们先来看该问题的简化版:统计区间[0,n]内可以用k个不同的二进制数的和来表示的数的个数。那么对于n=13(二进制位1101),k=3的情况,我们只需要原创 2015-10-20 16:18:29 · 473 阅读 · 0 评论 -
HDU3853 LOOPS 概率DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3853题目大意:有一个R*C的迷宫,开始点在[1,1],现在要走到[r,c],对于在点[x,y]可以消耗2点魔力打开一扇门,走到[x,],[x+1,y],[x,y+1],的概率分别为p0,p1,p2,问走到[r,c]点时消耗魔力的期望值。分析:我们用dp[i][j]表示在点[原创 2015-10-20 21:59:40 · 427 阅读 · 0 评论 -
HDU3652 B-number 数位DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3652题目大意:统计区间[1,n](n分析:数位DP,详解见代码。实现代码如下:#include #include using namespace std;int dp[15][15][3]; //dp[pos][mod][v]:pos纪录位数,mod纪录余原创 2015-10-19 19:23:28 · 570 阅读 · 0 评论 -
HDU2089 不要62 数位DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089题目大意:给一个区间[n,m](1e7的范围),找出区间内不含62(连续的6和2)和4的数有多少个。分析:数位DP,我们用f[i,st]来表示以st开头的符合题意的i位数的个数,对于每一次询问,分别统计[1,n]和[1,m+1]内的数,然后相减即可。实现代码如下原创 2015-10-19 11:31:35 · 412 阅读 · 0 评论 -
HDU4734 F(x) 数位DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4734题目大意:我们定义十进制数x的权值为f(x) = a(n)*2^(n-1)+a(n-1)*2(n-2)+...a(2)*2+a(1)*1,a(i)表示十进制数x中第i位的数字。题目给出a,b,求出0~b有多少个不大于f(a)的数。实现代码如下:/**求给定区间1~B中原创 2015-10-21 10:10:03 · 1123 阅读 · 0 评论 -
HDU5179 beautiful number 数位DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5179题目大意:找出[l,r]中高位数字可以整除低位且不小于低位数字的数的个数。实现代码如下:#include #include #include #include using namespace std;int dp[25][25][3];int bi原创 2015-10-19 20:33:30 · 532 阅读 · 0 评论 -
HDU3709 Balanced Number 数位DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3709题目大意:定义平衡数:以一个数的某一位为支点,其左右各个位分别乘以力矩的和是相等的。比如4139这个数,我们以3为力矩,左边的力矩和为4*2+1*1=右边的力矩和9*1。下载给出一个区间[l,r](0分析:数位DP。我们用dp(i,j,k)来表示以第j位为支点的力矩和为k时原创 2015-10-20 21:39:11 · 455 阅读 · 0 评论 -
HDU3555 Bomb 数位DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555题目大意:统计区间[1,n](n分析:我们可以先统计区间[1,n]内不含49的数的个数,然后拿n减去即可。实现代码如下://数位DP,统计区间[n,m]内含有49的数的个数#include #include #include using namesp原创 2015-10-20 21:12:43 · 440 阅读 · 0 评论 -
HDU4089 Activation 概率DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4089ActivationTime Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2382 Accepted Subm原创 2015-10-21 11:27:12 · 554 阅读 · 0 评论 -
POJ3107 Godfather 求树的重心
题目链接:http://poj.org/problem?id=3107题目大意:求树的重心,如果有多个节点,按节点编号升序输出所有的。分析:用vector存储图会TLE,这里用了前向星存储图,用set来记录节点可以省去排序(set是一颗二叉树,自动把加入的点按升序排列了)。实现代码如下:#include #include #include #inclu原创 2015-10-22 16:19:07 · 606 阅读 · 0 评论 -
POJ1655 Balancing Act 求树的重心
题目链接:http://poj.org/problem?id=1655题目大意:树的重心:找到一个点作为新的树根,其所有的子树中最大子树的节点数最少,那么这个点就是这个树的重心。树的重心的意义在于,删去重心后,生成的多棵树尽可能平衡。分析:一次搜索即可。DFS每一个点s,找出其各个子树的节点数,纪录最大值son[s],然后比较balance=max(son[s],n-son原创 2015-10-22 10:59:43 · 470 阅读 · 0 评论 -
HDU1290 平面分割空间
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1290分析:参考直线分割平面,我们知道平面分割与线之间的交点个数有关,即交点决定分割的线段和射线的条数,而线段和射线的条数决定分割的平面数,那么对应于三维空间当中,很容易想到,空间分割理应和平面的交线数有关,而事实也是如此。当有n-1个平面时,分割的空间数为f(n-1),那么第n个平面要想分原创 2015-06-04 16:00:32 · 592 阅读 · 0 评论 -
HDU2050 折线分割平面 动态规划
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2050 分析:首先我们来看一直线分割平面,直线分割平面时,每增加n个结点,就会增加n+1个平面,我们用f(n)来表示n条直线最多分割出的平面数,那么就有f(n)=f(n-1)+n;其中f(1)=2;即每新加一条直线,都使他和原先所有的直线都有交点,原先有n-1条直线,那么新加一条直线后,就会原创 2014-11-23 11:10:47 · 1191 阅读 · 0 评论 -
HDU2296 Ring AC自动机+DP
题目链接:点击打开链接题目大意:有m个关键字,每个关键字有一个权值,让构造出一个长度不大于n的目标串,使得该目标串的权值尽可能大。对于相同的权值的多个目标串,我们需要输出长度最小的一组,存在多个长度相同的目标串时输出字典序最小的一组。分析:构造出tire树,对于树中的每一个节点我们看做为一个状态,定义dp(i,j)为前i个字符在状态j时的最大权值,string s(原创 2015-05-11 18:36:19 · 473 阅读 · 0 评论 -
HDU1087 Super Jumping! Jumping! Jumping! 动态规划
#include #include #define MAX 1100using namespace std;int main(){ int ans[MAX],dp[MAX]; int n,i; while(scanf("%d",&n)&&n) { for(i=0;in;i++) scanf("%d",&ans[i]);原创 2014-10-31 12:24:28 · 388 阅读 · 0 评论 -
HDU1421 搬寝室 动态规划
#include #include #include #define MAX 2100#define INF 999999999using namespace std;int ans[MAX],dp[MAX][MAX/2];int main(){ int n,k; while(cin>>n>>k) { for(int原创 2014-10-30 21:22:34 · 559 阅读 · 0 评论 -
HDU2084 数塔 动态规划
数塔问题#include #include #include #define MAX 110using namespace std;int main(){ int t,n; int ans[MAX][MAX],dp[MAX][MAX]; cin>>t; while(t--) { scanf("%原创 2014-10-28 13:11:04 · 546 阅读 · 0 评论 -
HDU2955 Robberies 01背包
题目大意:Roy要抢劫银行,每抢一个银行都有一定的被抓概率,现在给你一个安全概率,以及每个银行的库存现金和抢劫该银行被抓的概率,问你在安全概率的情况下Roy最多可以抢劫多少现金。乍一看是背包问题,其实就是背包问题,只要稍微变形一下就行了,可以看出,本题中安全概率是背包的容量,每个银行的被抓概率是质量,但这样肯定是行不通的,因为我们要用dp[ i ]数组来纪录质量为i时的最大价值,那么质量显然要原创 2014-11-26 13:56:53 · 609 阅读 · 0 评论 -
HDU2546 饭卡 01背包
题目大意:给出n种菜的价格p(i)和饭卡上的余额m,要求饭卡上的余额m>=5元时才能买饭,切一定能购买成功(即余额可以为负值),现在问你余额最小为多少。我们知道:(1)当m>5元时由于不能购买饭菜,所以此时余额最小就是m了,直接输出就行了;(2)当m>=5时,我们留出5元放到最后来买最贵的菜,然后把卡上的余额尽可能的多花,这时候得到的余额即为最小值,那么问题来了,如何求出尽可能多的话出原创 2014-12-03 15:08:05 · 529 阅读 · 0 评论 -
HDU2571 命运 动态规划
#include #include #include #define INF -999999999using namespace std;int main(){ int t,n,m,i,j; int ans[25][1005],dp[25][1005]; cin>>t; while(t--) { memse原创 2014-11-23 14:19:01 · 539 阅读 · 0 评论 -
HDU2602 Bone Collector 01背包问题 动态规划
01背包问题:有n件物品和原创 2014-11-24 11:10:43 · 681 阅读 · 0 评论 -
Max Sum(最大子段和问题)
最大子段和:给定一个序列(元素可正可负),找出其子序列中和最大的值。我们用dp(i)表示序列中以元素ans(i)结尾的序列的最大子段和,那么有:dp(i)=max(dp)原创 2014-12-04 16:54:51 · 5289 阅读 · 0 评论 -
HDU1024 Max Sum Plus Plus 最大子段和(动态规划)
#include #include #include #define MAX 1000010#define INF -999999999using namespace std;int a[MAX],dp[MAX],temp[MAX];int main(){ int m,n,i,j; int nmin,ans; while(cin>>m>原创 2014-12-05 20:01:57 · 605 阅读 · 0 评论 -
动态规划之简单递推(HDU2041,HDU2044,HDU2045,HDU2046,HDU2047)
易知#include #include using namespace std;int ans[45];void init(){ ans[2]=1; ans[3]=2; for(int i=4;i ans[i]=ans[i-1]+ans[i-2];}int main(){ init();原创 2014-10-22 16:28:05 · 668 阅读 · 0 评论 -
HDU1708 Fibonacci String 动态规划
#include #include #include using namespace std;const int MAX=40;int num[MAX*2][MAX];void init(char a[],char b[]){ int i,len1,len2; len1=strlen(a); len2=strlen(b); for原创 2014-08-05 11:10:23 · 719 阅读 · 0 评论 -
POJ1160 Post Office 动态规划
题目大意:一条直线上有n个村庄,定义村庄之间的距离为两个村庄坐标的绝对值,要在这n个村庄当中建立m个邮局,每个村庄只能使用离其最近的邮局,求出使所有村庄都使用邮局所需走的最短距离。我们都知道只有一个邮局的情况,那么这个邮局肯定在正中间,这样才能使所有村庄到这点的距离之和最短;现在有m个邮局,我们定义一个二维数组tmp(i,j)来表示在第i个村庄到第j个村庄之间有一个邮局时的最短距离和,定义dp原创 2015-01-11 18:08:27 · 835 阅读 · 0 评论 -
HDU2151 Worm 动态规划
题目大意:给你n,p,m,t,表示一排n颗树,刚开始(第0分钟)毛毛虫在位置p,问经过m分钟,它到达了位置t的不同的方法数我们用dp(i,j)来表示在第i分钟毛毛虫到达位置j的方法数,那么有:dp(i,j)=max(dp(i-1,j-1),dp(i-1,j+1));#include #include using namespace std;int dp[110][110];原创 2014-12-06 21:28:02 · 550 阅读 · 0 评论 -
POJ1088 滑雪 DP+记忆化搜索
#include #include #include using namespace std;int map[105][105];int dp[105][105];int num,c,r;int bfs(int x,int y){ if(dp[x][y]) return dp[x][y]; int nmax=1; int len; if(x+1map原创 2015-03-10 13:14:48 · 585 阅读 · 0 评论 -
2015编程之美资格赛:回文子序列数 DP
2015编程之美资格赛第二题:回文子序列数题目链接:http://hihocoder.com/contest/msbop2015qual/problem/2分析:动态规划。用一个数组dp(i,j)表示在给定字符串str中第i个元素到第j个元素之间回文子序列的个数,在j==i时dp(i,j)=1;j和i相邻时判断str[ i ]和str[ j ]是否相等,分别赋值给dp(i,j)3和原创 2015-04-18 14:53:58 · 794 阅读 · 0 评论 -
HDU2457 DNA repair AC自动机+DP
题目链接:点击打开链接题目大意:给出n个带有遗传病的DNA序列和目标DNA序列,可以修改目标序列上若干字符使得目标串上不含有带有遗传病的DNA序列,修改尽可能少的字符串。分析:我们以这n个遗传病序列建一颗tire树,把树上的每个节点看做是一种状态,定义dp(i,j)为前i个字符串在j状态下为目标串(不含遗传病序列)时需修改的最少次数,这样在建完树后遍历一遍树上的节点,维护一原创 2015-05-11 15:15:17 · 547 阅读 · 0 评论 -
HDU2825 Wireless Password AC自动机+状态压缩DP
题目链接:点击打开链接题目大意:有m个关键字(只含有小写字母),让找出最少含有k个关键字的长度为n的字符串(也只含有小写字母)的个数。分析:做了这几道AC自动机——DP的题,也发现了这类题的一些规律:都是先按关键字建立一颗tire树,然后把树中的每一个节点看做是一种状态。本题定义dp(i,j,k)为长度为i的以j状态结尾,并且含有关键字个数为状态k时的字符串原创 2015-05-11 20:55:45 · 586 阅读 · 0 评论 -
HDU3534 Tree 求树的直径及其个数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3534题目大意:给出一颗n个节点的树,每条边对应一个长度,求出距离最大的两个节点之间长度,并找出一共有多少个顶点对。实现代码如下:/*求最长边的时候可以统计一下最长边的个数,那么以u为根节点的子树中最长边为:Len[u]+max(len[v]),个数node[u]*nod原创 2015-10-22 13:06:43 · 2589 阅读 · 1 评论