随笔分类 - tyvj
摘要:看起来不是很难,一道动规题(话说最近一直在刷动规题啊)一开始只想到两个动规方程: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])。
阅读全文
摘要:一道动规题目,不是很难,用两个二维数组即可搞定,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];
阅读全文
摘要:描述 Description中国古代的历史故事“田忌赛马”是为大家所熟知的。话说齐王和田忌又要赛马了,他们各派出N匹马,每场比赛,输的一方将要给赢的一方200两黄金,如果是平局的话,双方都不必拿出钱。现在每匹马的速度值是固定而且已知的,而齐王出马也不管田忌的出马顺序。请问田忌该如何安排自己的马去对抗齐王的马,才能赢取最多的钱?输入格式 InputFormat第一行为一个正整数n(n<=1000),表示双方马的数量。第二行有N个整数表示田忌的马的速度。第三行的N个整数为齐王的马的速度。输出格式 OutputFormat仅有一行,为田忌赛马可能赢得的最多的钱,结果有可能为负。样例输入 Sam
阅读全文
摘要:假如不看数据的话,是一道很简单的动态规划的题目。很容易想到方程: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
阅读全文
摘要:不知道为什么少了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,...
阅读全文

浙公网安备 33010602011771号