摘要: 一道动态规划的题目。区间动规?我不知道......第一次接触这种类型的动规,区间动规吧...就是石子合并。方程: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[... 阅读全文
posted @ 2012-12-04 21:58 改名字干什么 阅读(268) 评论(0) 推荐(0) 编辑
摘要: 看起来不是很难,一道动规题(话说最近一直在刷动规题啊)一开始只想到两个动规方程:f[i,j]表示第i分钟,疲劳度为j所能跑的最大距离。我们有:f[i,j]:=f[i-1,j-1]+s[i];f[i+j,0]:=max(f[i+j,0],f[i,j]);(若从此状态开始休息,那么他的距离是和f[i+j,0]一样的)后面想想不对,还少了一个方程。因为如果你休息到疲劳度为0,那么你即可以选择跑步,也可以选择继续休息,所以我们还有一个方程:f[i,0]:=max(f[i-1,0],f[i,0])。这样就好了。其实第二个方程还可以写成另一种形式:f[i,j]:=max(f[i,j],f[i-j,0])。 阅读全文
posted @ 2012-12-02 11:42 改名字干什么 阅读(167) 评论(0) 推荐(0) 编辑
摘要: 一道动规题目,不是很难,用两个二维数组即可搞定,f[i,j]表示吃前i道菜,当前状态用勺子或用筷子所用的最小值(j=1时代表筷子,j=2时代表勺子)。c[i,j]表示吃第i道菜,当前状态用勺子或用筷子吃该道菜的时间(这是已知数据)(j=1时代表筷子,j=2时代表勺子)t[i]表示吃第i道菜前转化餐具所额外需要的时间(这是已知数据)。我们就可以得出方程:f[i,j]:=min(f[i-1,j],f[i-1,3-j]+t[i])+c[i,j](1<=i<=n) (1<=j<=2).当然,我们要设置好边界条件,其中题目规定一开始使用筷子,所以:f[1,1]:=c[1,1]; 阅读全文
posted @ 2012-12-02 11:30 改名字干什么 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 描述 Description中国古代的历史故事“田忌赛马”是为大家所熟知的。话说齐王和田忌又要赛马了,他们各派出N匹马,每场比赛,输的一方将要给赢的一方200两黄金,如果是平局的话,双方都不必拿出钱。现在每匹马的速度值是固定而且已知的,而齐王出马也不管田忌的出马顺序。请问田忌该如何安排自己的马去对抗齐王的马,才能赢取最多的钱?输入格式 InputFormat第一行为一个正整数n(n<=1000),表示双方马的数量。第二行有N个整数表示田忌的马的速度。第三行的N个整数为齐王的马的速度。输出格式 OutputFormat仅有一行,为田忌赛马可能赢得的最多的钱,结果有可能为负。样例输入 Sam 阅读全文
posted @ 2012-12-01 22:11 改名字干什么 阅读(331) 评论(0) 推荐(0) 编辑
摘要: 假如不看数据的话,是一道很简单的动态规划的题目。很容易想到方程:f[i]:=min(f[i],f[i-j]+s[i]);(1<=j<=m);这个是 O(mn)的算法但是一看数据- - 一百万。优化有两种方法,一种是用堆O(nlogn), 一种使用单调队列优化O(n)。每次更新单调队列时,后面比当前状态f[i]大的全部踢走,然后把它加入队尾,同时把不能继续使用的值(序号小于当前序号减去m的值)踢走,保证了队列的单调递增性。我们就有 f[i]:=s[i]+f[d[t]](t是队列的头指针,d储存队列的数组)。然后把f[i]加入到队列之中。代码: 1 program p1313; 2 v 阅读全文
posted @ 2012-12-01 21:38 改名字干什么 阅读(154) 评论(0) 推荐(0) 编辑
摘要: 首先,前几天周老师对我们说了一句话:“有些人是表面学得好,有些人是内在学得好”。这一道题目是9月的时候考试时碰上的,但是自己太水了,没有做出来,后面一直就没有动他,今天拿来做一做,发现向总给我们的算法真心不是很好啊。我的方法。 我们用字符串数组存下他们,然后一个一个读取。 处理呢,用字符串数组是很方便的。 例如样例CAB+-, 我们设st 为字符串数组, 先读取,有 st[1]='C' st[2]='A' st[2]='B'; 遇到运算符号,就合并最后的两个字符串数组,并记录该数组的最低级别的运算符号, 例如st[2]合并成‘A+B',最 阅读全文
posted @ 2012-12-01 21:14 改名字干什么 阅读(188) 评论(0) 推荐(0) 编辑
摘要: 不知道为什么少了1,郁闷。一道动规题 1 program p1211; uses math; 2 var 3 i,j,k,l,m,n,x,y,ans:longint; 4 f:array[0..10010,0..4,0..4]of longint; 5 s:array[0..10000]of longint; 6 ch:char; 7 function zhuan(ch:char):longint; 8 begin 9 zhuan:=ord(ch)-48;10 end;11 function effort(a,... 阅读全文
posted @ 2012-11-27 20:27 改名字干什么 阅读(201) 评论(0) 推荐(0) 编辑
摘要: RT 搬到csdn 的 cjoi之小菜鸟(z731413411) 阅读全文
posted @ 2012-11-24 10:43 改名字干什么 阅读(160) 评论(2) 推荐(0) 编辑
摘要: 动态规划题目看懂有点困难 其实还是不是很难一个人从最左到最右最后回到最左点 ,并形成一个环,其实可以看成两个人都从最左点出发,然后以不同的路径到达最右点。假设一个人达到了第 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 阅读全文
posted @ 2012-11-17 16:10 改名字干什么 阅读(248) 评论(0) 推荐(0) 编辑
摘要: 前几天,算法的大概思路大概还是清楚了,就是不知道实现,唉,补作业去了,今天晚上弄了下,没什么头绪,于是先看了百度百科里的程序。一开始还是搞不懂,后面应该大概明白了,这是一个 样例数据,储存的方式是邻接矩阵。 (0,6,1,5,0,0), (6,0,5,0,3,0), (1,5,0,5,6,4), (5,0,5,0,0,2), (0,3,6,0,0,6), (0,0,4,2,6,0);prim 算法的大概思路是 一开始随便选一个点,找到与之相邻的最小权值,用数组f记录最小,百度百科里的意思大概... 阅读全文
posted @ 2012-10-19 20:21 改名字干什么 阅读(229) 评论(0) 推荐(0) 编辑