随笔分类 -  动态规划

摘要:几个概念:多阶段决策问题:如果一类过程可以分成若干个相互联系的阶段,在每一个阶段都需要做出决策,一个阶段的决策确定了以后,常常影响到下一个阶段的决策,从而就完全确定了一个活动的活动路线,则称其为多阶段决策问题。策略:多个阶段的决策序列构成一个决策序列称为策略。多阶段的决策问题,就是要在选择的那些策略中间,选择一个最优策略,使在预定的标准下达到最好的效果。阶段:把求解问题分成若干个阶段,以便于求解。多数情况下,阶段变量是离散的,用k表示,如果过程可以在任何时刻做出决策,且在任意两个不同的时刻之间允许有无穷多个决策 时,阶段变量就是连续的。状态:表示每个阶段开始面临的自然状况或客观条件,它既... 阅读全文
posted @ 2013-11-01 20:26 湖心北斗 阅读(791) 评论(0) 推荐(0)
摘要:这题是最长公共子序列的变形,要注意的就是,题目要求输出最长上升子序列的字典排序最小值,最麻烦的就是这个,想了半天都没什么思路,我对最长上升子序列的理解不是很透彻。在网上看了别人的题解,都是用一个结构题来保存状态 (公共子序列的长度,公共子序列的串)我才恍然大悟,既然这样,那不是搜索一遍所有的状态的字符串就可以了吗。#include #include #include #include #include using namespace std; #define MAXN 1010 struct Node { int l; string s; }no[MAXN][MAXN]; char sm[.. 阅读全文
posted @ 2013-09-23 22:21 湖心北斗 阅读(422) 评论(0) 推荐(0)
摘要:此题的大意是给定一个序列,求一个最长的奇数子序列,使得前k个序列上升,后k个序列下降。此题的解法是从左往右求一次最长上升子序列,然后从右往左再求一次最长上升子序列,分别记录在状态变量d1[i],d2[i],求min(d1[i],d2[i])的最大值即可,答案就是2*min-1。#include #include #include #include #include using namespace std; #define MAXN 10010 #define INF 1000000000 int seq[MAXN]; int d1[MAXN],d2[MAXN]; int g[MAXN]; in 阅读全文
posted @ 2013-09-23 21:59 湖心北斗 阅读(346) 评论(0) 推荐(0)
摘要:这个题目的大意就是,给你一个字符串,然后让你求出最少的回文数。我开始傻逼了,写了一个o(n^3)的算法,结果老超时。然后略看了别人的题解,才知道有个如此的转移方程。f[i+1]=min(f[j]+1,其中j~i是回文),基础的动态规划题目,还得多多加强训练。#include #include #include using namespace std; #define MAXN 1010 #define INF 1000000000 char s[MAXN]; int f[MAXN]; bool isp(int l,int r) { bool ok=1; for(int k=... 阅读全文
posted @ 2013-09-20 00:43 湖心北斗 阅读(285) 评论(0) 推荐(0)
摘要:题目的意思是有n台服务器运行着n类程序,一个黑客有n中类的病毒,最多每台服务器可以放一种病毒,但是相邻的服务器会感染同种病毒,只暂停一种服务,问能够暂停的程序的最大种数。解决的方法是,用位表示集合,问题的答案相当于是求出最多集合的组合,组合内的集合并集是全集。求这些组合最大的数目。转移方程式f[s]={f[s^s0],s0这种组合内的集合并集是全集}+1.这里涉及到一些集合的操作:或运算,将元素加入到集合之中。枚举集合的所有组合的可能性:for(int i=0;i0;i=(i-1)&s) { //insert code }代码:#include #include #include us 阅读全文
posted @ 2013-09-19 17:44 湖心北斗 阅读(319) 评论(0) 推荐(0)
摘要:题目的大意是有一个整数组成的序列,两个人轮流取数,只能从一端取一个或者多个数(这里大白书上写错了),当所有的数都被取完的时候,取到的所有的数之和为该玩家的分数,求A的分数-B的分数,两个人都是以最优的方案取值。这个问题使用动态规划求解,子问题就是i~j的子序列先手取得的分数最大值。设d[i][j]表示子序列i~j的先手取数所获得的最大分数则d[i][j]=sum[i][j]-min(d[i+1][j],d[i+2][j],d[i+3][j],...,d[j][j],....,d[i][j-1],d[i][j-2],d[i][j-3],...,d[i][i],0)。0表示所有的数都被先手取完。因 阅读全文
posted @ 2013-09-19 14:41 湖心北斗 阅读(315) 评论(0) 推荐(0)
摘要:题目大意是求两个数列的最长公共子序,由于数列的长度可以达到250*250=62500所以在n^2的时间限内是不可能做到了,这需要一个nlogn的方法。由于每个数字都不相同,因此可以将其转化成求最长上升子序的问题。先记录下第一个序列的下标,然后再检查第二个序列,如果在第一个序列中已经被记录,则该元素是公共元素,但不一定是公共自序中的元素,将他放入一个数组当中,这个数组当中元素的顺序是依照第二个序列的,如果能够找到最长公共子序的话,就必须使得该序列同时遵循第一个和第二个的出现顺序,也就是说,只要是最长上升子序,就是这两个序列的最长公共子序。因此可以转化为求最长上升子序的问题。#include #i 阅读全文
posted @ 2013-09-19 13:29 湖心北斗 阅读(194) 评论(0) 推荐(0)
摘要:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=31134#problem/B问题的大意是有n个数编号依次为1~n构成一个圈,第一次去掉编号为m的数字,以后没数到k把该数字去掉,问最后剩下什么数字。此题的解法是动态规划,递推。标准的约瑟夫问题是0~n-1的n个数从零开始,每数到k就把该数字去掉,随后剩下什么数字。我们可以将该题化为标准的约瑟夫问题。假设有n个数字的标准约瑟夫问题,编号为0~n-1,第一次去掉的数字是(k-1)%n,则剩下的数字是 k%n, k%n+1 n%k+2,...,n-1,,,,k%n-2我们作如下转换 设 k% 阅读全文
posted @ 2013-09-18 23:33 湖心北斗 阅读(415) 评论(0) 推荐(0)
摘要:这题刘汝佳大白书上的例题,自己总结一番,寻找递推关系。题意是从1~n中选择3个数,一共可以组成多少个三角形。1.组成三角形的条件是x+y>z,假设三角形最大的边是x则有x-y#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;const double eps(1e-8);typedef long long lint;#define clr(x) memset( x , 0 , sizeof(x) )#define repf(i 阅读全文
posted @ 2013-09-18 21:36 湖心北斗 阅读(234) 评论(0) 推荐(0)
摘要:这个问题使用动态规划求解,dp[i][j]表示字符串下标为i的字符和下标为j的字符区间内构成回文所需加入的最少的字符串。当str[i]==str[j]时,则dp[i][j]=dp[i+1][j-1],当str[i]!=str[j]时,dp[i][j]=min(dp[i+1][j]+1,dp[i][j-1]+1),初始化时候,d[i][i]=0,d[i][i+1]=1(这里真是纠结了一个多小时,我还以为我转移方程错了!!!)。输出dp[0][strlen(str)-1].#include #include #include using namespace std; char str[1001]; 阅读全文
posted @ 2013-08-07 23:49 湖心北斗 阅读(545) 评论(0) 推荐(0)
摘要:南阳理工学院动态规划专题括号问题2总结这道题目初看起来很简单,但是我从看题到思考,到做题ac足足花了一个晚上加一个下午的时间,我也有到网上找代码的习惯,但是都是递归,特别蛋疼,我想用正统的动归去做,于是就开始了不一样的艰难探索之旅。分析过程:使用char str[1001]这个字符数组保存最初输入的括号序列,使用dp[1001][1001]这个数组保存中间结果,dp[i][j]的意思是从下标为i的字符到下标为j的字符的子问题最少要加多少个括号才能规范化。首先dp数组初始化为零,显然dp[i][i]=1;至于dp[i][i+1],当str[i][i+1]配对的时候=0,当str[i][i+1]不 阅读全文
posted @ 2013-08-07 20:31 湖心北斗 阅读(346) 评论(0) 推荐(0)
摘要:ZOJ Problem Set - 1076Gene AssemblyTime Limit: 2 Seconds Memory Limit: 65536 KBStatement of the Problem With the large amount of genomic DNA sequence data being made available, it is becoming more important to find genes (parts of the genomic DNA which are responsible for the synthesis of proteins) 阅读全文
posted @ 2013-07-09 18:04 湖心北斗 阅读(226) 评论(0) 推荐(0)
摘要:ZOJ Problem Set - 2109FatMouse' TradeTime Limit: 2 Seconds Memory Limit: 65536 KBFatMouse prepared M pounds of cat food, ready to trade with the cats guarding the warehouse containing his favorite food, JavaBean. The warehouse has N rooms. The i-th room contains J[i] pounds of JavaBeans and requ 阅读全文
posted @ 2013-07-09 16:59 湖心北斗 阅读(147) 评论(0) 推荐(0)
摘要:ZOJ Problem Set - 1171Sorting the PhotosTime Limit: 2 Seconds Memory Limit: 65536 KBImagine you have a pile of 1 #include using namespace std; int main() { int cas; cin>>cas; while(cas--) { int n; cin>>n; char *pt=new char[n]; for(int i=0;i>pt[i]; char tag=pt[0]; int count=0; for(... 阅读全文
posted @ 2013-07-09 16:36 湖心北斗 阅读(257) 评论(0) 推荐(0)
摘要:ZOJ Problem Set - 1025Wooden SticksTime Limit: 2 Seconds Memory Limit: 65536 KBThere is a pile of n wooden sticks. The length and weight of each stick are known in advance. The sticks are to be processed by a woodworking machine in one by one fashion. It needs some time, called setup time, for the m 阅读全文
posted @ 2013-07-09 15:16 湖心北斗 阅读(160) 评论(0) 推荐(0)
摘要:ZOJ Problem Set - 1108FatMouse's SpeedTime Limit: 2 Seconds Memory Limit: 65536 KB Special Judge FatMouse believes that the fatter a mouse is, the faster it runs. To disprove this, you want to take the data on a collection of mice and put as large a subset of this data as possible into a sequenc 阅读全文
posted @ 2013-07-09 05:00 湖心北斗 阅读(247) 评论(0) 推荐(0)
摘要:ZOJ Problem Set - 1016ParencodingsTime Limit: 2 Seconds Memory Limit: 65536 KBLet S = s1 s2 ... s2n be a well-formed string of parentheses. S can be encoded in two different ways:By an integer sequence P = p1 p2 ... pn where pi is the number of left parentheses before the ith right parenthesis in S 阅读全文
posted @ 2013-07-09 00:58 湖心北斗 阅读(185) 评论(0) 推荐(0)