动态规划
文章平均质量分 71
三江小渡
这个作者很懒,什么都没留下…
展开
-
POJ1191棋盘分割 NYOJ87
另外分享朋友们一起开发的oj:该题地址:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=87/*POJ1191棋盘分隔,刘汝佳黑书面有解析,大概思路如下: * 根据方差公式推倒出如果需要方差最小,则需要每个被减数的平方最小,即每块棋盘的总分平方和最小 * 考虑左上角坐标为(x1,y1),右下角坐标为(x2,y2)的棋盘,设它的总和为sum[x1,y1,x2,y2]切割k次以后得到 * k+1块矩形的总分平方和最小值为d[k,x1,y1,x2原创 2011-01-10 00:41:00 · 580 阅读 · 0 评论 -
【POJ3356】AGTC (动态规划dp+最长公共子序列lcs)
<br /><br />一个字符串可以插入、删除、改变到另一个字符串,求改变的最小步骤。和最长公共子序列类似,用二维数组opt[i][j]记录字符串a中的前i个字符到字符串b中的前j个字符匹配所需要的最小步数。假如已知AG到GT的最小步数,AGT到GT的最小步数,AG到GTT的最小步数,求AGT到GTT的最小步数,此时T= =T,这个值是AG到GT的最小步数,AGT到GT的最小步数加一(AGT到GT的最小步数等于AGTT到GTT的最小步数,加一是将T删除的一步),AG到GTT的最小步数加一(AG到GTT的最原创 2011-04-22 16:04:00 · 645 阅读 · 0 评论 -
【POJ1887 || 2355 || 1631】Testing the CATCHER(最长递增(递减)子序列)NYOJ224
题目说的很长,但是最后求的就是最长递减子序列。。。好吧 刷水题。。。#include #include #include using namespace std;int arr[100010];int main(){ freopen("1.txt","r",stdin); int n,j,i,num=1; while(scanf("%d",&arr[0])!=EOF){ if(arr[0]==-1) break; int count=0; i=1; w原创 2011-04-22 16:37:00 · 648 阅读 · 0 评论 -
【POJ1953】World Cup Noise(动态规划,斐波那契数列)
<br />/*设f[i]表示长度为i的以0结尾的合法队列个数*设g[i]表示长度为i的以1结尾的合法队列个数*显然有*f[i]=f[i-1]+g[i-1]; (1)*g[i]=f[i-1]; (2)*(2)代入(1)即*f[i]=f[i-1]+f[i-2];*最终合法队列总个数为f[n]+g[n]即f[n]+f[n-1]=f[n+1]*即求斐波那契数列的第n+1项*1,2,3,5,8,13,21.............*/#include<cst原创 2011-04-20 10:31:00 · 910 阅读 · 0 评论 -
【POJ1080】Human Gene Functions(动态规划 最长公共子序列)
<br />//解题思路://和《算法导论》中动态规划章节的LCS(Longest common subsequence 最长公共子序列)所用例子基本是一样的,//都是测两串基因的相似程度,不同之处在于《导论》用LCS表示两基因的相似程度,LCS越长,相似度越大。//本题中用下面的核苷相近程度取值表表示两基因相似程度,各相应核苷对匹配值之和越高,相似程度自然越大。//首先回想LCS的解法,//设两基因串为an,bm//a[i],b[j]分别表示a串的第i个核苷,b串的第j个核苷/原创 2011-04-22 10:19:00 · 500 阅读 · 0 评论 -
【POJ1157】LITTLE SHOP OF FLOWERS (简单动态规划)
<br /> <br /><br />该题也是经典的动态规划,题目叙述的依然很麻烦,其实简化一下就是这样的:例如下面这个例子就是:3表示行,5表示列,然后在下面的3行5列每一行选一个数,使这3个数最大,要求选的数列数必须依次增大,就是从左上方想右下方选3个数使和最大。<br />3 5<br />7 23 -5 -24 16<br />5 21 -4 10 23<br />-215 -4 -20 20<br /> <br />状态转移方程 arr[i][j]=max{arr[i-1][ 0...(j-1原创 2011-04-25 09:20:00 · 648 阅读 · 0 评论 -
【POJ1014】Dividing (动态规划,多重背包)
<br /><br />思想:本题是找按价值均分大理石的方案是否存在,由于分配时不能破坏大理石,所以有个显而易见的剪枝:当所有的大理石的总价值为奇数时肯定不能被均分。把问题转化一下即:由一个人能否从原大理石堆中取出总价值为原来一半的大理石,本题的主要算法是动态规划,数组flag代表状态,设总价值为sum.当flag[k]==true时,说明,可以有一人获得价值k,另外一人获得价值V-k的大理石分配方案。反之若flag[k]=false说明这种分配方案不存在.我们的任务就是计算出flag[sum/2]是tru原创 2011-04-25 15:23:00 · 766 阅读 · 0 评论 -
【POJ1050】To the Max (动态规划、最大字串和、最大子矩阵和)||NYOJ44 ||NYOJ104
其实就是最大子段和问题在二维空间上的推广。先说一下一维的情况吧:设有数组a0,a1…an,找除其中连续的子段,使它们的和达到最大。假如对于子段:9 2 -162 temp[i]表示以ai结尾的子段中的最大子段和。在已知temp[i]的情况下,求temp [i+1]的方法是:如果temp[i]>0 temp [i+1]= temp[i]+ai(继续在前一个子段上加上ai),否则temp[i+1]=ai(不加上前面的子段),也就是说 状态转移方程:temp[i] = (temp[i-1]>0?temp[i原创 2011-04-25 10:20:00 · 547 阅读 · 0 评论 -
【POJ1179】Polygon (动态规划 DP)
<br /><br />多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形。每个顶点被赋予一个整数值,每条边被赋予一个运算符“+”或“*”。所有边依次用整数从1到n编号。<br />游戏第1步,将一条边删除。<br />随后n-1步按以下方式操作:<br />(1)选择一条边E以及由E连接着的2个顶点V1和V2;<br />(2)用一个新的顶点取代边E以及由E连接着的2个顶点V1和V2。将由顶点V1和V2的整数值通过边E上的运算得到的结果赋予新顶点。<br />最后,所有边都被删除,游戏结束。原创 2011-04-28 10:36:00 · 1749 阅读 · 0 评论 -
【POJ1125】Stockbroker Grapevine(动态规划,floyd)
<br />题意:股票Broker们需要在他们的客户中传播谣言,但是每个Broker只能传给他自己的顾客们。给出Broker们和他们所<br />拥有的顾客,求能让谣言传播从第一个人开始到最后一个客户的最短时间。使用Floyd算法。输入样例是有多少经纪人,随后是每行第一个数是相应编号的经纪人联系的人,然后之后每对数表示联系的人的编号和联系需要花的时间。<br />#include <iostream>#include <cstring>using namespace std;#define da原创 2011-04-26 17:26:00 · 568 阅读 · 0 评论 -
【POJ1160】Post Office(动态规划 DP)
<br /><br />题目给出一条直线上的m个村庄及其距离,给出n个邮局,要求怎么建n个邮局使代价最小。<br />思路:用opt[i][j]记录把前i个邮局建到前j个村庄中的最优解,用cost[i][j]记录所有在i到j村庄中,建1个邮局的最小代价。显然邮局应该设到中点。让前i个邮局覆盖前j个村庄,第i+1个邮局覆盖第j+1至j+k个村庄(j+k<=n),则状态转移方程为<br />res[i+1][j+k]=min{res[i][j]+cost[j+1][j+k];} (k+j<=n)<br />Co原创 2011-04-26 10:18:00 · 680 阅读 · 0 评论 -
【POJ1260】Pearls (动态规划)
<br /> <br />题意:现在要买若干种价值的珍珠,但买某种珍珠必须多付10颗此种珍珠的价钱,一颗珍珠可以用比它贵的珍珠充数,因此有时候用贵的珍珠来代替便宜的可能更省钱,输入要买的若干种珍珠,在可用高价珍珠充数的条件下,问最少需要花费多少钱.<br />假设有价值从x……y的珍珠,则在购买最大价值为z(x 所以可以得到状态转移方程为:<br />res[i]=min{res[i],(num[i]-num[j]+10)*p[i]+res[j]}<br />其中j<br />由状态转移方程我们发现如果合并原创 2011-05-03 15:26:00 · 680 阅读 · 0 评论 -
【POJ2411】Mondriaan’s Dream(动态规划)
discuss里看到的牛B方法。。。。短小精悍,看到后十分汗颜,就像做TC样。自己写老长的代码,跟排名前几的代码一比就像dog shit。要走的路还遥遥无期,根本没头啊~~~~。留下大家也观摩下吧。。。——————————用2进制的01表示不放还是放第i行只和i-1行有关枚举i-1行的每个状态,推出由此状态能达到的i行状态如果i-1行的出发状态某处未放,必然要在i行放一个竖的方块,所以我对上一行状态按位取反之后的状态就是放置了竖方块的状态。然后用搜索扫一道在i行放横着的方块的所有可能,并且把这些状态累加上i原创 2011-05-04 15:58:00 · 880 阅读 · 0 评论 -
【POJ2192】Zipper(动态规划)
<br /><br />这个题目要求判断2个字符串能否组成1个字符串,例如cat和tree能组成tcraete。我们定义一个布尔类型的二维数组 array,array[i][j]表示str1[i]和str2[j]能否组成str[i+j].i=0或者j=0表示空字符串,所以初始化时,array[0][j]表示str1的前j个字符是否和str都匹配。<br />对于str=tcraete:<br /> <br />Null<br />c<br />a<br />t<br />Null<br />1<br />0原创 2011-04-22 11:23:00 · 610 阅读 · 0 评论 -
【POJ2250】Compromise (最长公共子序列,DP)
<br />POJ上边一直WA啊,找N久N久,找不到错误,看到的人求教育我啊。、。。。。<br />#include<cstdio>#include <string>#include <iostream>#include <cstring>#include <algorithm>using namespace std;int reslen[301][301];int respos[300][301];string st1[101],st2[101],resst[101];原创 2011-04-21 14:55:00 · 479 阅读 · 0 评论 -
NYOJ61传纸条双线DP
<br /> <br /> <br />/* NYOJ61传纸条双线DP,大概思路如下: * 首先考虑题意是从左上角传到右下角,再从右下角传到左上角,并且不能重复路线上任何点,除起始点和终点外 * 这样问题就可以转化为从起点双线走向终点,双线不相交。类似于单线DP,我们可以写出双线DP方程 * 针对该为题我们唯一需要添加的就是限制条件,不能让此双线相交。 * 状态转移方程: * d[k,x1,y1,x2,y2]=max{ d[k-1,x1-1,y1,x2-1,y2], d[k-1,x1原创 2011-01-10 00:45:00 · 848 阅读 · 0 评论 -
POJ1088 滑雪 && NYOJ 10 skiing 经典的动态规划练习题
理解了十分简单,思路日下:用一个结构体存储位置和相应位置的高度,然后根据高度从低到高排序。之后就从第一个最小的数据开始处理,根据结构体中记录的位置向上下左右寻找排序后的第二个数据(即次小的数据),然后其滑行最远距离存储在一个相应的矩阵中,最后可轻易获取最长滑行距离。 #include#include#include#includeusing namespace std;int h[104][104];int l[104][104];struct len{ int x,原创 2011-03-16 08:30:00 · 519 阅读 · 0 评论 -
Noi 01炮兵阵地 & poj1185 &NYOJ81 炮兵阵地 状态压缩和动态规划
<br />http://acm.nyist.net/JudgeOnline/problem.php?pid=81<br /> /*为大家方便明白,注释比较多。该题可深化动态规划,学会滚动数组,状态压缩等知识。*/#include<iostream>#include <string.h>using namespace std;char map[101][11];//地图int surface[101];//地形状态压缩数int state[61];//所有的合法状态压缩数in原创 2011-03-15 16:22:00 · 1009 阅读 · 0 评论 -
POJ3783 Balls DP动态规划
/* 动态规划DP: 状态转移方程:DP[i][j]=DP[i][j-1]+DP[i-1][j-1]+1; 其中i代表小球个数,j代表可扔次数。 由状态转移方程可清晰看出,DP[i][j]在第某层楼X扔下一个小球, 如果该球破碎,那么其结果是DP[i-1][j-1]的情况(即少一个球少一次机会); 如果该球未破碎,那么其结果是DP[i][j-1]的情况(即球不少,但少一次机会);*/#include #include using namespace st原创 2011-03-21 13:51:00 · 1433 阅读 · 0 评论 -
POJ 3660 && NYIST 211 Cow Contest && ZOJ 1060 Sorting It All Out【Floyd算法扩展应用】
Floyd算法:Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法(百度百科给的。。。)。 核心思路 通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。 从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1);又用同样地公式由D(1)构造出D(2);……;最后又用同样的公式由D(n-1)构造出矩阵D(n)。矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩原创 2011-03-30 14:35:00 · 582 阅读 · 0 评论 -
NYOJ110 剑客决斗 【动态规划DP】
描述在路易十三和红衣主教黎塞留当权的时代,发生了一场决斗。n个人站成一个圈,依次抽签。抽中的人和他右边的人决斗,负者出圈。这场决斗的最终结果关键取决于决斗的顺序。现书籍任意两决斗中谁能胜出的信息,但“A赢了B”这种关系没有传递性。例如,A比B强,B比C强,C比A强。如果A和B先决斗,C最终会赢,但如果B和C决斗在先,则最后A会赢。显然,他们三人中的第一场决斗直接影响最终结果。假设现在n个人围成一个圈,按顺序编上编号1~n。一共进行n-1场决斗。第一场,其中一人(设i号)和他右边的人(即i+1号,若i=n,原创 2011-04-06 19:27:00 · 2136 阅读 · 0 评论 -
[POJ1082]Calendar Game & HDU1079 Calendar Game
<br /><br /><br />解题思路<br /> <br />博弈论题目可以用寻找必败状态的方法解决。<br /> <br />第一个必败状态是2001.11.04。由此可以推出其他任何时间的状态。对于除2001.11.04外的其他任何时间,present状态是由能移动到的下两个next状态决定的(当然有些时间只有一个next状态),比如1924.12.19的状态是由1924.12.20和1925.01.19两个状态决定。如果两个next状态中有一个必败状态,则present状态为必胜状态;如果两个原创 2011-04-11 09:15:00 · 815 阅读 · 0 评论 -
背包问题全集
<br />有名的背包九讲,YM各种总结性文章,转来留念。<br />前人V5,后人奋进~!===P01: 01背包问题<br />题目<br />有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。<br />基本思路<br />这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。<br />用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:<br />f[i][v转载 2011-04-14 10:27:00 · 530 阅读 · 0 评论 -
【poj1579】Function Run Fun (动态规划DP递归,记忆化递归)
<br />#include<cstdio>using namespace std;int arr[21][21][21];int fun(int a,int b,int c){ if(a<=0||b<=0||c<=0) return 1; if(a>20||b>20||c>20) return arr[20][20][20]; if(arr[a][b][c]!=0) return arr[a][b][c]; if(a<b && b<c) return arr[a][原创 2011-04-20 08:59:00 · 636 阅读 · 0 评论 -
【poj2081】Recaman's Sequence (动态规划DP)
<br />#include<cstdio>using namespace std;bool isexist[3012505]={1};int res[500005]={0};int main(){ int temp; for (int m=1;m<=500000;m++) { temp=res[m-1]-m; if((temp)>0 && !isexist[temp]) { isexist[temp]=1; res[m]=res[m-1]-原创 2011-04-20 09:39:00 · 493 阅读 · 0 评论 -
【poj1458】Common Subsequence || nyoj36 (动态规划)
<br />状态转移方程:<br /><br />if(st1[i]==st2[j])<br />res[i+1][j+1]=res[i][j]+1;<br />else<br />res[i+1][j+1]= res[i][j+1]>res[i+1][j] ?res[i][j+1]:res[i+1][j] ;<br />res[i][j]表示字符串字串st1[0-i],st2[0-j]的公共子序列长度。<br />#include<cstdio>#include <string>#include原创 2011-04-20 10:55:00 · 439 阅读 · 0 评论 -
【POJ 3280】 Cheapest Palindrome(动态规划 回文串)
<br /> <br /> 题意:现在有一个由n个字符组成的长度为m的字符串,可以对其通过增加字符或者删除字符来使其变成回文字符串,而增加或者删除字符都有一个花费,求解使该字符串变成回文所进行操作的最小花费.<br /> 用dp[start][end]表示使字符串ss[being]……ss[end]变成回文字符串所需的最小花费,只需考虑开始位置和结束位置即可.<br /> 1> 如果ss[begin]!=ss[end],那么有四种操作可以使其变成回文:<br />转载 2011-04-19 11:13:00 · 593 阅读 · 0 评论 -
【POJ2479】Maximum sum(动态规划,DP)
<br />跟之前的求子段最大和差不多,不知道请看http://blog.pureisle.net/?p=266<br />这里求的是两个子段最大和,注意看数据,两个子段均不能为空(偶在这里多两次WA)。。。。另附POJ,discuss里边别人粘贴出来了一层循环写法。。。道理都差不多,时间也差不多。<br />#include <cstdio>#include <algorithm>using namespace std;int a[1000001];int res[1000001];i原创 2011-05-03 15:22:00 · 842 阅读 · 0 评论