随笔分类 -  ACM——DP

摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4745题意:有两只兔子Tom Jerry, 他们在一个用石头围城的环形的路上跳, Tom只能顺时针跳,Jerry只能逆时针跳, 要求在跳的过程中他们所在石头的权值必须相同,而且只能单向跳,中间不能有已经跳过的石头。思路:模型就是求环上的最长回文串,我们只要将原串倍增,然后每个长度为n的子串的最长回文串就是我们要求的。区间DP一下就好了, 注意要考虑起点终点是统一点的情况特殊。//#pragma comment(linker, "/STACK:1024000000,1024000000")# 阅读全文
posted @ 2013-09-20 10:02 E_star 阅读(266) 评论(0) 推荐(0) 编辑
摘要:论文:http://hi.baidu.com/3xianbin/item/917aca907a3fb6f4291647fchttp://wenku.baidu.com/view/d2414ffe04a1b0717fd5dda8.html其中一道题目求给定区间的所有数的k进制的各位数字的和:#include #include #include #include #include #include #include #include #include #include #include #include #include #include #define CL(arr, val) memse... 阅读全文
posted @ 2013-06-18 20:54 E_star 阅读(563) 评论(0) 推荐(1) 编辑
摘要:http://www.codeforces.com/problemset/problem/148/D题意:一个袋子里面装有n个小白鼠,m个小黑鼠,A,B两人轮流从中取老鼠,A先取,规定谁先取到白色小鼠谁就赢。B比较特殊,每当他取完一只老鼠时,总是会惊动其他的老鼠,所以取完之后剩下的老鼠会从袋子中溜掉一只。 而对于A取完后不会存在这种情况。问A取胜的概率。思路:首先我想了一个4维的dp[i][j][k][2] i表示到了第几步(这里可以用滚动数组优化,然后就可以存了) j表示还剩下白鼠j只,k表示还剩下黑鼠k只,最后一维: 0 表示取白鼠,1表示取黑鼠,状态转移就很好想了,就是分取白鼠还是取黑鼠 阅读全文
posted @ 2013-04-30 21:38 E_star 阅读(374) 评论(0) 推荐(0) 编辑
摘要:题意:规定只包含4或7的数为幸运数字,给定n个数的序列,求他的子序列,使得该子序列的长度为k并且满足该子序列中不存在相同的两个幸运数字。问一共寻在多少种可能。(只要该数的下标不同则认为是不同的序列)思路:记录每个幸运数字的个数,枚举从非幸运数中取出的个数i,那么在幸运数字中取k - i。这里C(no,i)好算,直接带公式算除法取模,而在幸运数字中取k-i个的可能需要同过dp来算,这里类似于01背包模型,dp[i +1][j + 1] = dp[i][j]*a[i] + dp[i][j + 1]; 表示前i个取了j个的可能数。这里对dp进行了空间优化View Code //#pragma com 阅读全文
posted @ 2013-04-29 10:17 E_star 阅读(270) 评论(0) 推荐(0) 编辑
摘要:pagesectionnotitlesubmit1131.5.1例题1括号序列POJ11411161.5.1例题2棋盘分割POJ11911171.5.1例题3决斗Sicily18221171.5.1例题4“舞蹈家”怀特先生ACM-ICPC Live Archive1191.5.1例题5积木游戏http://202.120.80.191/problem.php?problemid=12441231.5.2例题1方块消除http://poj.org/problem?id=13901231.5.2例题2公路巡逻http://202.120.80.191/problem.php?problemid=1 阅读全文
posted @ 2013-04-15 16:37 E_star 阅读(610) 评论(0) 推荐(0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4532题意:中文...思路:话说这类题目做的真的很少,比赛时无从下手。首先我们不考虑组内之间的顺序问题,将其转化为组合。dp[i][j]表示第i组插入到队列中存在j个空,该空的左右两边是同一组的人,这样我们只要将第i + 1组的人查到该空的话,就是合法的。 这里用了一下滚动数组优化了一下。dp[cur][i - k + x - j] += dp[pre][i]*c[x - 1][j - 1]%mod*c[i][k]%mod*c[sum - i][j - k]%mod;pre表示前一状态,i表示枚举的前一状态. 阅读全文
posted @ 2013-04-02 08:37 E_star 阅读(415) 评论(0) 推荐(0) 编辑
摘要:题意:中文。。思路:这里的等级限制是,与他本身交易的以及间接交易的都不能超过m。所以我们在树形DP时,维护可行区间即可。 关键是在维护可行区间时卡住了。View Code #include <iostream>#include <cstdio>#include <cmath>#include <vector>#include <cstring>#include <algorithm>#include <string>#include <set>#include <functional># 阅读全文
posted @ 2013-03-14 22:44 E_star 阅读(206) 评论(0) 推荐(0) 编辑
摘要:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1451题意:中文.....思路:pku有一道题,经典的括号匹配(区间DP)题目,那道题目是求的最长满足条件的子串的长度,那里的子串与这里的子串条件不一样。详细:http://www.cnblogs.com/E-star/archive/2013/01/28/2879385.html对于这个例子)((())))(()())pku的最长子串是12而这里是6这里我们是求的连续的满足的子串。dp[i]表示0到i的最长的满足的连续的子串则有:if(str 阅读全文
posted @ 2013-01-28 19:40 E_star 阅读(223) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=2955题意:给定一个只包含'(' , ')' , '[', ']'的字符串,求满足括号匹配的最长子串。思路:区间DP,只要找到满足()或者 [] 匹配的, dp[i][j] = dp[i +1][j - 1] + 2;然后再枚举i到j之间一点求最大值。记忆化搜索://#pragma comment(linker,"/STACK:327680000,327680000")#include <iostream>#include <cstdio& 阅读全文
posted @ 2013-01-28 08:45 E_star 阅读(267) 评论(0) 推荐(0) 编辑
摘要:http://acm.hdu.edu.cn/diy/contest_showproblem.php?cid=18068&pid=1008题意:给你n个数a[n],求从中顺序的选出k个数b[k],这k个数分别进行如下操作,sum = b[1]*1 + b[2]*2 + b[3]*3 + ...... + b[k]*k 求使得sum最小。才开始von给我说可能需要单调队列优化,我看看了,用单调队列做了一下。提交不对,一看状态转移方程推错了。囧....后来一看这不是一个很典型的状态转移方程式吗。以前做过类似的题目dp[i][j] = min(dp[i - 1][j],dp[i - 1][j 阅读全文
posted @ 2012-12-02 21:34 E_star 阅读(173) 评论(0) 推荐(0) 编辑
摘要:http://codeforces.com/contest/245/problem/H题意:给定一个字符串s(1 ≤ |s| ≤ 5000) 然后又q个询问(1 ≤ q ≤ 106) 每次询问包括两个数l,r 求l到r内回文串的个数。思路:自己对dp的感觉真是弱爆了,大牛们16分钟就能A出来的题目,自己想了好久还是没思路,最后看了别人的代码才AC的,弱爆了。dp[i][j] = d[i][j -1] + dp[i + 1][j] - dp[i + 1][j - 1] - R[i][j] 这里R[i][j]表示子串s[i...j]是否是回文串,这里的处理太棒了,自己没能想到。还有就是转移方程也. 阅读全文
posted @ 2012-11-21 20:54 E_star 阅读(220) 评论(0) 推荐(0) 编辑
摘要:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1008题意:给定n个串,求这n个串的的最长公共子序列。思路:首先说一下自己的思路,dp确实挺弱的没想到变维dp。就想了一个贪心的算法,贪心是这样的:把s[0]与后边的串匹配,求出所有满足最大长度的子串,然后依据每个串在后边可能出现的概率取最大的继续往后求最长公共子序列,直到结束。这里出现的概率计算:我们统计出现的字符总数,然后计算每个字符出现的概率,然后就可以求子串在后边未参与匹配的串中出现的概率了。这个算法要回溯出所有可能的解,数据大的话会超 阅读全文
posted @ 2012-11-20 21:20 E_star 阅读(580) 评论(0) 推荐(0) 编辑
摘要:http://codeforces.com/problemset/problem/2/B题意:给定n*n的一个数字矩阵,求从左上角(1,1)走到右下角(n,n)将每个数字相乘,使得乘机中包含的0最少。要求只能往下走或者往右走。思路:状态转移方程很好看,关键是怎么保证所得乘积所含0个数最少。想一下如何才能使乘积中出现0呢?只有质因子2*5才能出现0,其余的质因子相乘不会出现。所以我们只要保证使得2与5的个数凑出来的10最少即可,即2与5的个数最少即可 我们肯定得到一条路线使得ans = min(2num,5num); ans的值在所有路线里是最小的。即得到了所得答案。开始我同时枚举的路线上的2与 阅读全文
posted @ 2012-10-27 23:31 E_star 阅读(344) 评论(0) 推荐(0) 编辑
摘要:pku 1463Strategic gamehttp://poj.org/problem?id=1463题意:给定一个树,求在节点上放士兵来检查所有的线路。当i节点有士兵的时候,与i节点相连接的线路都可以被检测了。求所需的最少的士兵。思路:dp[i][0]表示i节点不放士兵,dp[i][1]表示i节点放士兵,dp[i][0] += dp[j][1] j是i的子节点 若果i节点未放士兵,则它的子节点必须放士兵dp[i][1] += min(dp[j][0],dp[j][1]) j是i的子节点 若i节点放了士兵,则它的子节点可放可不放。View Code #include <iostream 阅读全文
posted @ 2012-10-13 17:32 E_star 阅读(328) 评论(0) 推荐(0) 编辑
摘要:hdu 1712 ACboy needs your help 分组背包入门题目http://acm.hdu.edu.cn/showproblem.php?pid=1712题意:acboy今年有n门课程,给出每门课程他授课多少天能获得的利润,w[i][j]表示第i个课程他如果授课j天可获得的利润,求在m天内它能够获得最大利润。思路:每门课程看做一个分组,每门课程对应着m个物品可选,直接套用分组背包即可。View Code #include <iostream>#include <cstdio>#include <cstring>#include <alg 阅读全文
posted @ 2012-10-12 20:11 E_star 阅读(392) 评论(0) 推荐(0) 编辑
摘要:pku 1276Cash Machinehttp://poj.org/problem?id=1276题意:自动取款机里面的最大存钱量为cash,现在有n种不同价值的纸币,每个都有一定的数量,问这些纸币能够组合出来的小于等于cash的最大值。思路:典型的多重背包,转换01思想的做法TLE,只能用二进制倍增优化。View Code #include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <qu 阅读全文
posted @ 2012-10-10 19:15 E_star 阅读(847) 评论(0) 推荐(0) 编辑
摘要:pku 1384 Piggy-Bank 完全背包入门题目。http://poj.org/problem?id=1384这里只是求的恰好装满,且是最小罢了。在恰好装满时只要给f[0] = 0; 其他的一个未定义状态负无穷正无穷即可。View Code #include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <queue>#include <stack>#include &l 阅读全文
posted @ 2012-10-10 09:55 E_star 阅读(298) 评论(0) 推荐(0) 编辑
摘要:pku 3624Charm Bracelethttp://poj.org/problem?id=3624最裸的01背包。View Code #include <cstdio>#include <cstring>#include <iostream>#define CL(a,num) memset((a),(num),(sizeof(a)))#define N 3405#define M 12888using namespace std;int c[N],w[N];int f[M];int main(){ int i,j; int n,m; scanf(&qu 阅读全文
posted @ 2012-10-07 22:19 E_star 阅读(1108) 评论(0) 推荐(0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4293题意:有n个人分成了若干组走在一条林荫道路上,导游为了能够确定人数,要求每个人喊出自己所在的队伍前边有多少人Ai表示,后边有多少人Bi表示,于是我们得到了n条信息。这里面有错误的信息也有正确的信息,要求我们尽量使正确信息最大求出正确信息的数量。思路:想了很久一直在捉摸它的最有子结构从何而来,怎样dp....今天下午虎哥给了点提示终于明白了如何做了。。。YM虎哥.....首先我们根据每个人提供的前边Ai个人,后边Bi个人,可以确定这个人所在队伍的人数的范围。于是我们得到了N个区间,我只要求出不想交区间最多 阅读全文
posted @ 2012-09-18 17:23 E_star 阅读(315) 评论(0) 推荐(0) 编辑
摘要:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4772题意:给定n个点n-1条边,每个点对应一个财富值,走每条路径都对应着一个所需要的时间,问在m天内从k出发然后回到k,所能取得到的最大财富值 v1 V2 ....V1.思路:由于题目给定的是一棵生成树,所以从k出发后必须按原路返回才可满足条件,也就是每条边走两次。dp[k][m]表示从k出发的又回到k的路径所取得的最大值。就是相当于往容量为m的包里放物品一样。每个点对应一个包。View Code #include <iostream>#include < 阅读全文
posted @ 2012-09-16 10:36 E_star 阅读(194) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示