随笔分类 - vijos
1
摘要:跟数的划分有些类似,递归+记忆化搜索,做过数的划分的人做这道题目应该不是很难。http://www.cnblogs.com/zyxx233/archive/2012/12/08/2809187.html这是数的划分题解同样的,我还是以haha来作为函数.....(个人癖好)状态:haha(s,t,k).意思是从s到t的数段中加入k 个乘号所能得到的最大值。所以 ans:=haha(1,n,k).状态的转移:for i:=1 to t-k-s+1 do begin val(copy(st,s,i),m); if ha[s+i,t,k...
阅读全文
摘要:算法:DP。如果数据不是很大的话我们就可以直接DP了...但是数据有 10^9,所以普通的DP根本不能AC.我记得一个月以前我做了这道题目,普通地DP,然后只能过三个点。数组不能开这么大,就算能开这么大也会超时。这里有个路径压缩的优化方法。。。。(纯属装B....)首先我们先分析一下数据规模,我们发现呢,L<=10^9. 而石子的个数m<=100.这就意味着平均两个石子中间有10^7 的路是没有石子的。也就是说,两个石子中间我们进行了很多没有必要的DP。我们可以稍微把中间给缩减一下。我们通过一个运算求得一次最短可跳长度(S)到一次最长可跳长度(T)中的每一个数的最小公倍数的值为k。
阅读全文
摘要:多线程 DP。真心觉得这个方程不好想!设f[k,i,j,l], 表示走第k步,第一个人,第二个人和第二个人各走到第I行,第j行和第L行所能得到的最优解(我们规定前一个人比后一个人先走!)。状态转移:规定 t[1]:=0; t[2]:=-1;for w:=1 to 2 do for q:=1 to 2 do for p:=1 to 2 do f[k,i,j,l]:=max(f[k,i,j,l],f[k-1,i+t[w],i+t[q],l+t[p]])共有八种状态转移的方式!接下来:由于更新了 i,j,l 并规定了前一个人比后一个人先走所以:有 f[k,i,j,l]:=f[k,i,j,l...
阅读全文
摘要:我想说,题目的意思有误啊!!!!他说任意两份不能相同,我就以为分成的每个部分都不能相同...但他的意思是这是个组合,不是排列(即不考虑顺序问题....)被坑了.....算法: 递归+记忆化搜索顺便说一下 个人比较喜欢用 haha来作为函数的名称.....ans:=haha(n,k,min). 意思是从 把n 分成 k份的方案数,至于后面的1。意思是分出来的每份的值小于min(初始值为1),这个东西在后面有用。因为我们要得出的是一个组合,不是排列,所以我们可以设每次的方案分出的数的序列都是一个不降的序列,如此就有:当k>=2 时,我们有haha(n,k,min):=haha(n,k,min
阅读全文
摘要:一道动态规划的题目。区间动规?我不知道......第一次接触这种类型的动规,区间动规吧...就是石子合并。方程:F[i,j] = min{F[i,k] + F[k + 1,j] + c[i,j] | i <= k < j}。我们可以用递推的方法实现它,但是如何递推是个问题。自然而然地,先求得长度为1的区间,然后是长度为2的区间,然后3.....至于添括号的方法和各个中间和,我们可以用两个字符串数组来处理他们。具体看代码: 1 program p1038; uses math; 2 var 3 i,j,k,l,m,n,ans:longint; 4 s:array[...
阅读全文
摘要:动态规划题目看懂有点困难 其实还是不是很难一个人从最左到最右最后回到最左点 ,并形成一个环,其实可以看成两个人都从最左点出发,然后以不同的路径到达最右点。假设一个人达到了第 i 个 点, 第二个人达到了 第J个 点 ,我们可以设i>j ,无论是第一个人还是第二个人走到第i 个点,他们都是等效的。于是我们就有f[i,j] 来表示 第两个人分别走到 第i个点和第j个点的 最短距离。假设当前状态是f[i,j],当i-j>1时,由于i 与 j 中间还有(i-j-1)个点,所以该状态只能由 f[i-1,j]得出,所以有 f[i,j]=f[i-1,j]+dist[i,i-1]. 其中 dist
阅读全文
摘要:DP,从左到右,从上到下 for 一遍,如果j为跟盖房子有点像,我只算了向下的三角,有人说要算向上的三角,但是还是A了......不知道什么原因。 1 program p1063; uses math; 2 var 3 i,j,k,l,m,n:longint; 4 s:array[1..300,1..300] of char; 5 f:array[1..300,1..300] of longint; 6 ch:char; 7 begin 8 read(n); 9 for i:=1 to n do10 begin11 rea...
阅读全文
摘要:这道题.....感觉很难,主要是我觉得很难弄出方程式;方程式为f[i,j]=min(f[i-2,j-1]+s[i,j],f[i-1,j]);表示第j组到第i个人的残疾指数的最小值。注意每次for 次数的时候,直接for 到 i div 3就可以了,之后就没有意义了。 1 program P1061; uses math; 2 var 3 i,j,k,l,m,n,x:longint; 4 s:array[1..5500] of longint; 5 f:array[-1..5500,0..2000] of longint; 6 begin 7 {assign(in...
阅读全文
摘要:一到DP题目,跟晴天小猪历险记之hill类似,光扫一次不够,设个布尔变量,确定不能再优时,退出循环,一开始本来以为要记录比自己低的和比自己高的,结果总是超时,后来发现其实只要记录二者之一就OK。代码: 1 program P1011; uses math; 2 var 3 i,j,k,l,m,n:longint; 4 bool:boolean; 5 s:array[0..501,0..501]of longint; 6 up,down:array[0..501,0..501]of longint; 7 begin 8 ...
阅读全文
摘要:这道题,动规,但是如果只扫一次的话,往往发现得出来的解不是最优解的,所以要扫多次,知道确保没有变化了为止,说明就有最优解了;不一定要预处理,可以分情况讨论。还要加油啊 1 program P1006; uses math; 2 var 3 s:array[0..1010,0..1010]of longint; 4 f:array[0..1010,0..1010]of longint; 5 i,j,k,l,m,n,ans:longint; 6 bool:boolean; 7 begin 8 read(n); 9 ...
阅读全文
摘要:模拟,单纯模拟会超时,但是有个定理:若从此地发现没油,则不必从头开始搜,直接从当前地开始就可以了。 1 program P1091; 2 var 3 n,m,i,j,k,l,l2,h,q,x,w:longint; 4 s,pow,ha:array[1..600000] of longint; 5 bool:boolean; 6 begin 7 read(n,l); 8 l2:=l; 9 for i:=1 to n do10 begin11 read(s[i],pow[i]);12 if s[i]<=...
阅读全文
摘要:不知道是什么算法 1 program p1737; 2 var 3 i,j,k,l,h,w,left,right,b,ans,n,x,y,num,pmin:longint; 4 c,p,s:array[0..200010] of longint; 5 q:array[0..51,1..200010] of longint; 6 function haha(a,b:longint):boolean; 7 var 8 i:longint; 9 begin10 for i:=a to b do11 ...
阅读全文
摘要:今天DP第二道题,采药,其实就是背包问题,不知道要是没看教程会不会做,但是没有看源码编出来,也算是一个不小的进步,嘿嘿。 1 program P1104; 2 uses math; 3 var 4 t,v:array[1..1001] of longint; 5 f:array[0..1001,0..1001]of longint; 6 t1,m,i,j,k,l:longint; 7 begin 8 fillchar(f,sizeof(f),0); 9 read(t1,m);10 for i:=1 ...
阅读全文
摘要:好吧刚开始学DP,DP应该是确保每个子结构是最优的,递推式貌似很重要,想到递推式的话,程序实现应该不会很难。这道题的思想是:求以每一个点为终点的最长上升子序列和最长下降子序列,最后的序列即使每一个点的上升序列和下降序列之和减一 的最大值,ANS即为 N-最大值。代码: 1 program p1098; 2 var 3 a:array[0..200] of longint; 4 up,down,ans:array[0..200] of longint; 5 i,j,k,l,m,n,max:longint; 6 begin 7 rea...
阅读全文
摘要:大概思路, 杨辉三角+递推,不是很难,可是被取模坑了,提交了5 ,6次才过。还要加油啊! 1 program P1739; 2 var 3 l,i,j,x,y,k,m,n,q:longint; 4 a:array[0..10000,0..10000] of longint; 5 begin 6 read(x,y,k,n,m); 7 a[1,1]:=x mod 10007; a[1,2]:=y mod 10007; 8 for i:=2 to k do 9 for j:=1 to i+...
阅读全文
摘要:贪心算法,纠结了好久,昨天开始做,大概思路是 每到一站比一次,若有比这个油价小的,加到正好可以到那个加油站的油,如果不行就加满! 1 program p1253; 2 var 3 s,d1,d2,c,q2,w,now,k,p0:real; 4 n,i,j,l,m,q,past:longint; 5 d:array[0..110] of real; 6 p:array[0..110] of real; 7 begin 8 assign(input,'haha.in'); 9 reset(input);...
阅读全文
摘要:今天基本上一个晚上的时间都花在这道题目了,感觉是一道典型的 BFS,主要时间花在判重的方法上了;一开始没判重,而且每比较,所以得不到最短时间.....一开始是在每个坐标上设布尔值,若走过此地则 布尔:=false; 后来发现根本不行,因为路径不同,也可能走过同一个地方;后来 zyt 大牛灵光一现,我茅塞顿开,其实可以在每个坐标上记录从起点到该坐标的最短时间(首先要预处理,否则都为0了),如果当前所用时间小于记录时间,则记录时间等于当前时间,继续此次操作;否则停止这次操作,进行下一次操作;感觉对搜索越来越熟悉了,程序是需要练的啊........恩...贴一下代码...... 1 program
阅读全文
摘要:向总今天中午跟我们说要做合并果子,用堆来做,堆是前几天才学的,还没怎么熟悉。程序的大概思路是用 贪心+堆结构,不知道快排能否过,现在还没试。每次取出一个最小值,筛一次,维护堆(每次都加了一个maxlongint,防止越界的情况,想向各位大牛们请教更好的方法。);两个最小值相加,既是该次所耗体力,再把它放入堆中。代码............... 1 program P1097; 2 var 3 s,n,i,j,k,u,x,y:longint; 4 a:array[1..10001] of longint; 5 procedure shai(m,n:longint); 6 var...
阅读全文
摘要:恩.......DFS深度搜索+递归,主要是判断的问题(弄了比较久....),把每一次的字母数记录下来,找最大值;代码如下.....感觉还是不错的......program p1311;var s:array[1..21] of string; b:array[1..21] of longint; i,j,k,z,y,l,n,m,max:longint; ch,ch2:char;procedure haha(a:string;data:longint);var i,j,k,l,m,c,data2:longint; s2:string;function pan...
阅读全文
摘要:恩...用DFS深搜,本来是想编一个循环的DFS的,可是编了好久没有编出来,所以干脆还是用递归的办法编了一个,递归倒不是很难,这道题感觉有点八皇后的影子,每次一到临界条件然后判断是否符合题意就可以了,把程序贴下,顺便向大牛们求循环的编法。 1 program p1128; 2 var 3 n,s,k,i,j,m:longint; 4 x:array[1..30]of longint; 5 procedure haha(a,q,s:longint); 6 var 7 i,j:longint; 8 function ha(a:longint):boo...
阅读全文
1

浙公网安备 33010602011771号