动态规划47题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

动态规划练习【题目一览】
总分
【问题描述】
学生在我们USACO的竞赛中的得分越多我们越高兴。

我们试着设计我们的竞赛以便人们能尽可能的多得分,这需要你的帮助。

我们可以从几个种类中选取竞赛的题目,这里的一个“种类”是指一个竞赛题目的集合,解决集合中的题目需要相同多的时间并且能得到相同的分数。

你的任务是写一个程序来告诉USACO的职员,应该从每一个种类中选取多少题目,使得解决题目的总耗时在竞赛规定的时间里并且总分最大。

输入包括竞赛的时间M(1<=M<=10000)(不要担心,你要到了训练营中才会有长时间的比赛)和“种类”的数目N(1<=N<=10000)。

后面的每一行将包括两个整数来描述一个“种类”:
第一个整数说明解决这种题目能得的分数(1<=points<=10000),第二整数说明解决这种题目所需的时间(1<=minutes<=10000)。

你的程序应该确定我们应该从每个“种类”中选多少道题目使得能在竞赛的时间中得到最大的分数。

来自任意的“种类”的题目数目可能任何非负数(0或更多)。

计算可能得到的最大分数。

【输入格式】
输入文件中的第1行:M,N--竞赛的时间和题目“种类”的数目。

第2~N+1行:两个整数:每个“种类”题目的分数和耗时。

【输出格式】
输出文件中仅一行,包括那个在给定的限制里可能得到的最大的分数。

【输入输出样例】
输入:
300 4
100 60
250 120
120 100
35 20
输出:
605
从第2个“种类”中选两题第4个“种类”中选三题。

邮票
【问题描述】
已知一个N枚邮票的面值集合(如,{1分,3分})和一个上限K——表示信封上能够贴K张邮票。

计算从1到M的最大连续可贴出的邮资。

例如,假设有1分和3分的邮票;你最多可以贴5张邮票。

很容易贴出1到5分的邮资(用1分邮票贴就行了),接下来的邮资也不难:
6 = 3 + 3
7 = 3 + 3 + 1
8 = 3 + 3 + 1 + 1
9 = 3 + 3 + 3
10 = 3 + 3 + 3 + 1
11 = 3 + 3 + 3 + 1 + 1
12 = 3 + 3 + 3 + 3
13 = 3 + 3 + 3 + 3 + 1
然而,使用5枚1分或者3分的邮票根本不可能贴出14分的邮资。

因此,对于这两种邮票的集合和上限K=5,答案是M=13。

【输入格式】
输入文件中的第一行:两个整数K和N(1<=K<=200,1<=N<=50)。

K是可用的邮票总数,N是邮票面值的数量。

第二行..文件末:N个整数,每行15个,列出所有的N个邮票的面值,面值不超过10000。

【输出格式】
输出文件中的第一行:一个整数,从1分开始连续的可用集合中不多于K张邮票贴出的邮资数。

【输入输出样例】
输入:
5 2
1 3
输出:
13
家的范围
【问题描述】
农民约翰在一片边长是N(2<=N<=250)英里的正方形牧场上放牧他的奶牛(因为一些原因,他的奶牛只在正方形的牧场上吃草)。

遗憾的是,他的奶牛已经毁坏一些土地。

(一些1平方英里的正方形)农民约翰需要统计那些可以放牧奶牛的正方形牧场(至少是2×2的,在这些较大的正方形中没有小于1×1的部分被分割毁坏)。

你的工作要在被供应的数据组里面统计所有不同的正方形放牧区域(>2×2)的个数。

当然,放牧区域可能是重叠。

【输入格式】
输入文件中的第1行:N,牧区的边长。

第2到n+1行:N个没有空格分开的字符。

0表示“那一个区段被毁坏了”,1表示“准备好被吃”。

【输出格式】
输出那些存在的正方形的大小和个数,一种一行。

【输入输出样例】
输入:
6
101111
001111
111111
001111
101101
111001
输出:
2 10
3 4
4 1
游戏
【问题描述】
有如下一个双人游戏:N(2<=N<=100)个正整数的序列放在一个游戏平台上,两人轮流从序列的两端取数,取数后该数字被去掉并累加到本玩家的得分中,当数取尽时,游戏结束。

以最终得分多者为胜。

编写一个执行最优策略的程序,最优策略就是使自己能得到在当前情况下最大的可能的总分的策略。

你的程序要始终为第二位玩家执行最优策略。

【输入格式】
输入文件中的第一行:正整数N,表示序列中正整数的个数。

第二行至末尾:用空格分隔的N个正整数(大小为1~200)。

【输出格式】
输出文件中只有一行,用空格分隔的两个整数:依次为玩家一和玩家二最终的得分。

【输入输出样例】
输入:
6
4 7 2 9
5 2
输出:
18 11
商店购物
【问题描述】
在商店中,每一种商品都有一个价格(用整数表示)。

例如,一朵花的价格是2 zorkmids(z),而一个花瓶的价格是5z。

为了吸引更多的顾客,商店举行了促销活动。

促销活动把一个或多个商品组合起来降价销售,例如:
三朵花的价格是5z而不是6z,两个花瓶和一朵花的价格是10z而不是12z。

编写一个程序,计算顾客购买一定商品的花费,尽量利用优惠使花费最少。

尽管有时候添加其他商品可以获得更少的花费,但是你不能这么做。

对于上面的商品信息,购买三朵花和两个花瓶的最少花费是:以优惠价购买两个花瓶和一朵花(10z),以原价购买两朵花(4z)。

【输入格式】
输入文件中包括一些商店提供的优惠信息,接着是购物清单。

第一行:优惠商品的种类数s(0<=s<=99)。

第二行..第s+1行:每一行都用几个整数来表示一种优惠方式。

第一个整数n(1<=n<=5),表示这种优惠方式由n种商品组成。

后面n对整数c和k(1<=k<=5,1<=c<=999),表示k个编号为c的商品共同构成这种优惠,最后的整数p(1<=p<=9999)表示这种优惠的优惠价。

优惠价总是比原价低。

第s+2行:这一行有一个整数b(0<=b<=5),表示需要购买b种不同的商品。

第s+3行..第s+b+2行:这b行中的每一行包括三个整数:c,k和p(1<=c<=999,1<=k<=5,1<=p<=999)。

c表示唯一的商品编号,k表示需要购买的c商品的数量。

p表示c商品的原价。

最多购买5×5=25个商品。

【输出格式】
输出文件中只有一行,输出一个整数:购买这些物品的最低价格。

【输入输出样例】
输入:
2
1 7 3 5
2 7 1 8 2 10
2
7 3 2
8 2 5
输出:
14
“破锣摇滚”乐队
【问题描述】
你刚刚继承了流行的“破锣摇滚”乐队录制的尚未发表的N首歌的版权。

你打算从中精选一些歌曲,发行M张CD。

每一张CD最多可以容纳T分钟的音乐,一首歌不能分装在两张CD中。

不巧你是一位古典音乐迷,不懂如何判定这些歌的艺术价值。

于是你决定根据以下标准进行选择:歌曲必须按照创作的时间顺序在CD盘上出现。

选中的歌曲数目尽可能地多。

【输入格式】
输入文件中的第一行:三个整数:N,T,M(1<=N<=20,1<=M<=20,1<=T<=20)。

第二行:N个整数,分别表示每首歌的长度,按创作时间顺序排列。

【输出格式】
一个整数,表示可以装进M张CD盘的乐曲的最大数目。

【输入输出样例】
输入:
4 5 2
4 3 4 2
输出:
3
麦香牛块
【问题描述】
农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块。

奶牛们正在想尽一切办法让这种可怕的设想泡汤。

奶牛们进行斗争的策略之一是“劣质的包装”。

“看”,奶牛们说,“如果你用只有一次能装3块、6块或10块的三种包装盒装麦香牛块,你就不可能满足想要一次只想买1、2、4、5、7、8、11、14或17块麦香牛块的顾客了。

劣质的包装意味着劣质的产品。


你的任务是帮助这些奶牛。

给出包装盒的种类数N(1<=N<=10)和N个代表不同种类包装盒容纳麦香牛块个数的正整数i(1<=i<=256),输出顾客不能用上述包装盒(每种盒子数量无限)买到麦香牛块的最大块数。

如果在限定范围内所有购买方案都能得到满足,则输出0。

范围限制是所有不超过2000000000的正整数。

【输入格式】
输入文件中的第1行:包装盒的种类数N。

第2行到N+1行:每个种类包装盒容纳麦香牛块的个数。

【输出格式】
输出文件中只有一行数字:顾客不能用包装盒买到麦香牛块的最大块数或0(如果在限定范围内所有购买方案都能得到满足)。

【输入输出样例】
输入:
3
3
6
10
输出:
17
最长前缀
【问题描述】
在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的。

生物学家对于把长的序列分解成较短的(称之为元素的)序列很感兴趣。

如果一个集合 P 中的元素可以通过串联(允许重复;串联,相当于Pascal中的“+”运算符)组成一个序列S,那么我们认为序列S可以分解为P中的元素。

并不是所有的元素都必须出现。

举个例子,序列ABABACABAAB可以分解为下面集合中的元素:
{A,AB,BA,CA,BBC}
序列S的前面K个字符称作S中长度为K的前缀。

设计一个程序,输入一个元素集合以及一个大写字母序列,计算这个序列最长的前缀的长度。

【输入格式】
输入文件中的开头包括1..200个元素(长度为1..10)组成的集合,用连续的以空格分开的字符串表示。

字母全部是大写,数据可能不止一行。

元素集合结束的标志是一个只包含一个“.”的行。

集合中的元素没有重复。

接着是大写字母序列S,长度为1..200000,用一行或者多行的字符串来表示,每行不超过76个字符。

换行符并不是序列S的一部分。

【输出格式】
输出文件中只有一行,输出一个整数,表示S能够分解成P中元素的最长前缀的长度。

【输入输出样例】
输入:
A A
B BA CA BBC
.
ABABACABAABC
输出:
11
货币系统
【问题描述】
母牛们不但创建了他们自己的政府而且选择了建立了自己的货币系统。

[In their own rebellious way],他们对货币的数值感到好奇。

传统地,一个货币系统是由1,5,10,20或25,50和100的单位面值组成的。

母牛想知道有多少种不同的方法来用货币系统中的货币来构造一个确定的数值。

举例来说,使用一个货币系统{1,2,5,10,…}产生18单位面值的一些可能的方法是:18×1,9×2,8×2+2×1,3×5+2+1等等其它。

编写一个程序来计算有多少种方法用给定的货币系统来构造一定数量的面值。

保证总数将会适合long long(C/C++)和Int64(Free Pascal)。

【输入格式】
货币系统中货币的种类数目是V(1<=V<=25)。

要构造的数量钱是N(1<=N<=10000)。

第1行:两个整数V和N。

第2..V+1行:可用的货币V个整数(每行一个,每行没有其它的数)。

【输出格式】
输出文件中单独的一行包含那个可能的构造的方案数。

【输入输出样例】
输入:
3 10
1 2 5
输出:
10
垃圾陷阱
【问题描述】
卡门——农夫约翰极其珍视的一条Holsteins奶牛——已经落了到“垃圾井”中。

“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2<=D<=100)英尺。

卡门想把垃圾堆起来,等到堆得与井同样高时,她就能逃出井外了。

另外,卡门可以通过吃一些垃圾来维持自己的生命。

每个垃圾都可以用来吃或堆放,并且堆放垃圾不用花费卡门的时间。

假设卡门预先知道了每个垃圾扔下的时间t(0<t<=1000),以及每个垃圾堆放的高度h(1<=h<=25)和吃进该垃圾能维持生命的时间f(1<=f<=30),要求出卡门最早能逃出井外的时间,假设卡门当前体内有足够持续10小时的能量,如果卡门10小时内没有进食,卡门就将饿死。

【输入格式】
输入文件中的第一行为两个整数,D和G(1<=G<=100),G为被投入井的垃圾的数量。

第二到第G+1行每行包括三个整数:
·T(0<T<=1000),表示垃圾被投进井中的时间;
·F(1<=F<=30),表示该垃圾能维持卡门生命的时间;
·H(1<=H<=25),该垃圾能垫高的高度。

【输出格式】
如果卡门可以爬出陷阱,输出一个整表示最早什么时候可以爬出。

否则输出卡门最长可以存活多长时间。

【输入输出样例】
输入:
20 4
5 4 9
9 3 2
12 6 10
13 1 1
输出:
13
样例说明:
·卡门堆放她收到的第一个垃圾:height=9;
·卡门吃掉她收到的第二个垃圾,使她的生命从10小时延伸到13小时;
·卡门堆放第三个垃圾,height=19;
·卡门堆放第四个垃圾,height=20。

神秘的咒语
【问题描述】
身为拜月教的高级间谍,你的任务总是逼迫你出生入死。

比如这一次,拜月教主就派你跟踪赵灵儿一行,潜入试炼窟底。

据说试炼窟底藏着五行法术的最高法术:风神,雷神,雪妖,火神,山神的咒语。

为了习得这些法术,要付出艰辛的努力,但是回报同样十分丰厚。

拜月希望你告诉他咒语的长度为多少。

(你:“请问您想知道咒语的具体内容吗?”拜月:“想,但是vijos不支持special judge。

”原来大人物也有大人物的悲哀…)
于是你偷偷躲在一边,想乘机看看咒语究竟是什么。

突然,天空(??试炼窟底看的到天空??)出现了两条非常长的数字串,你抓狂了。

究竟哪个才是真正的咒语呢?你突然想到,这两个都不是咒语(不妨称之为伪咒语),而真正的咒语却与他们有着密切的联系。

于是你打开拜月亲手给你写的纸条:“The Real Incantation is Their Common Increasing Subsequence of Maximal Possible Length”
“该死的拜月,居然还会E文!”你咒骂着,但为了一家老小的生命,又不得不卖命地算着咒语的长度。

【输入格式】
输入文件中的第一行为一个数N,代表有N组测试数据。

对于每组测试数据,描述了两条数字串,首先一个数字为一条伪咒语的长度M,接下来M个数描述了伪咒语的内容。

【输出格式】
输出文件中共N行,每行一个数字,描叙了对应咒语的长度。

【输入输出样例】
输入:
1
5 1 4 2 5 -12
4 -12 1 2 4
输出:
2
【数据范围】
对于100%的数据,有1<=N<=5,1<=M<=500,Ai,Bi在长整型范围内。

天堂的馈赠
【问题背景】
小杉找到了做棉花糖的最优方案,想去摘云朵,可是摔死了……
他来到了天堂。

天堂当然是很大的,也是很缭乱的。

小杉看到一块路标,写着“天堂的馈赠”。

【问题描述】
考虑到小杉刚死没多久,为了安抚他受创的心灵和思恋的感情,
天堂派出一个天使给小杉送礼,但IQ不够高的小杉可不能够拿到好礼物。

馈赠在天堂门口进行。

天使站在云端,往下扔礼物。

天堂之门的宽度为W格(按1..W编号),高度为0格,云端的高度为H格,小杉只能站在格子里。

开始时(第0秒),小杉站在天堂之门的第P格。

馈赠开始后,天使会在某些时刻从云端的某格扔礼物下来,礼物下落的速度(格/秒)是不一样的。

小杉左右移动去接礼物(每秒可以移动1格或不移动)。

礼物之间的价值当然是不一样的,小杉事先知道了每个礼物的价值。

当礼物在某一秒末恰好到达小杉所在的格子中,小杉就接到了这个礼物。

小杉想知道,他最多可以拿到价值为多少的礼物。

而且,由于礼物下落的速度有些可以很……,小杉还想知道是不是有些礼物他怎么样也拿不到。

【输入格式】
输入文件中的第一行有四个数W,P,H,N(1<=P<=W<=500),(1<=H<=500),(0<=N<=3000)。

接下来N行,每行四个数t,r,v,s(0<=t<=1500),(1<=r<=W),(1<=v<=H),(|s|<=1e5)。

表示天使在t时刻,云端的第r格,以v格/秒的速度扔下价值s的礼物。

输入均为正整数。

【输出格式】
输出文件中有两行。

第一行仅有一个整数,表示小杉最多能拿到价值多少的礼物。

第二行也仅有一个整数,表示小杉不可能拿到的礼物总价值多少。

【输入输出样例】
输入:
1 1 1 1
1 1 1 1
输出:
1
注释:注意:当礼物在某一秒末恰好到达小杉所在的格子中,小杉才能接到这个礼物。

【数据范围】
10%的数据W<=100,H<=100,N<=200。

上帝的爱好
【问题背景】
拿了一些礼物,小杉想走进天堂,可却被拦了下来。

因为上帝很喜欢词这个文体,他要求小杉必须写几首词来应对。

写的词越多,能带进天堂的刚才拿的礼物就越多。

【问题描述】
我们知道,词都是按照词牌来填的,上帝为了考验小杉,只给了他四种词牌,但只要压韵就算符合词牌。

小杉已经想好了N个意境优美的句子,每个句子都有一个韵脚。

符合要求的词的句式应当有如下四种“XXYY”,“XYXY”,“XYYX”,“XXXX”,其中X或Y表示韵脚。

现在小杉想知道,从他想的N个句子之中,最多能按顺序挑选出几首符合条件的词。

并且词的句子间不能交错,比如你选了1 4 6 8做为一首诗,那么7你就不能再选了。

【输入格式】
输入文件中的第一行有一个数N(N<=4000)。

第二行有N个不超过10000的正整数,第i个整数表示第i个句子的韵脚,整数相同表示韵脚相同。

【输出格式】
输出文件中仅一行一个数字,表示小杉最多能挑出几首词来。

【输入输出样例】
输入:
12
1 2 4 2 3 1 2 2 1 1 2 2
输出:
2
注释:样例最多可以挑出两首词,一种方案如下:1 2 4 6/9 10 11 12。

【数据范围】
30%的数据N<=100。

苹果旅游
【问题背景】
xiaoT发现山谷相当的大,准确地说应该是相当的长,xiaoT想到山谷的那头去看看,但是靠xiaoT 走路的速度,到那边要n年。

还好xiaoT可以买一些苹果(??苹果买苹果??自相残杀or大义灭亲),它把这些苹果当成动力,根据火箭发射的原理(晕,这个苹果知道得真多),如果xiaoT把苹果向后扔,xiaoT就会向前进(Q:xiaoT能把苹果扔多远?A:xiaoT拥有超强的臂力。

Q:xiaoT怎么会有手呢?A:…)。

【问题描述】
苹果有两种,一种青苹果,一种红苹果。

已知到山谷的长度为k,用一些(同一种类)苹果可以通过的路程为1。

苹果的价格是不一样的,红苹果的价格是红苹果个数的四次方。

青苹果的价格就是青苹果个数。

【输入格式】
输入文件中的第一行有一个正整数n,表示xiaoT走路到那边需要的时间。

第二行有一个正整数k,表示山谷的长度。

接下来k行,每行两个正整数,分别表示通过该段:
·如果使用红苹果,则需要的数量为a;
·如果使用青苹果,则需要的数量为b。

【输出格式】
输出文件中只有一个数,即买苹果的最少的花费。

【输入输出样例】
输入:
2296
3
3 1000
2 5000
4 8000
输出:
2296
样例解释:第1段用青苹果,第2、3段用红苹果,花费是1000+(2+4)4。

【数据范围】
对于30%的数据,k<=10;
对于50%的数据,k<=25;
对于100%的数据,k<=50;
对于100%的数据,每段路消耗的红苹果的数量<=10;
对于100%的数据,每段路消耗的青苹果的数量<=107。

文科生的悲哀
【问题背景】
化学不及格的Matrix67无奈选择了文科。

他必须硬着头皮艰难地进行着文科的学习。

【问题描述】
这学期的政治、历史和地理课本各有n章。

每一科的教学必须按章节从前往后依次进行。

若干章政治、若干章历史和若干章的地理内容可以合成一个教学阶段。

年级计划将整个学期的内容分成若干个阶段进行教学。

为了保证各科教学进度相同,年级规定每一个阶段包含的各科的章节数必须相同。

一个阶段包含的章节越多,这个阶段所需要的课时也就越多。

经过研究,假如某个阶段包含政史地各k章,则政治学习需要花费3^k天的课时,历史学习需要花费5^k天的课时,地理学习需要花费2^k天的课时,最后还需要4天的综合训练。

一个阶段所花费的总时间是以上四项时间的和。

为了便于安排时间,学校希望每个阶段恰好需要若干周来完成。

因此,划分出的每一个阶段所需要的天数都必须是7的整数倍(高三是没有星期六和星期天的)。

那么,这学期的课程最多可以划分成多少个阶段呢?你会想到,要想划分的阶段数最多,一个阶段完成一章的任务就行了(因为3^1+5^1+2^1+4=14是7的整数倍)。

但问题没有这么简单。

每个课本都可能有一些独立性较强的连续章节,它们具有很强的连续性,必须在一个阶段中完成。

如果你已知所有不能划分在两个或两个以上的阶段中的连续章节,你还能计算出最多能安排多少个阶段吗?
【输入格式】
输入文件中的第一行有两个用空格隔开的正整数n和m,分别表示各科课本的章节数和不可分割的连续章节的个数。

第二行到第m+1行,每行告诉了一个信息,该信息说明了哪一个课本的第几章到第几章必须一次性完成。

同一科目给定的章节有可能重复或有重叠。

每一行信息分为两个部分。

第一部分是“Politics:”、“History:”、“Geography:”三个字符串中的一个;第二部分是用“-”连接的两个数字x,y(1<=x<y<=n),表示该行第一部分所示的课本从第x章到第y章具有连续性。

第二部分紧接在第一部分后面,没有任何符号分隔。

【输出格式】
一个正整数,表示按照学校和年级的种种要求(见下)最多可以安排的阶段个数。

如果没有符合条件的安排方案,请输出-1。

注意:以下三个要求需要同时考虑。

1.每一个阶段包含的各科章数相同;
2.按时间函数计算出的各阶段所需天数必须是7的倍数;
3.给出的任一个连续章节都不能被分割开来。

【输入输出样例】
输入:
8 3
Politics:1-2
History:5-6
Politics:1-4
动态规划练习
输出:
3
样例说明:
最多可以安排三个阶段,具体方案如下:
第一阶段完成各科第1-6章的课程
第二阶段完成各科第7章的课程
第三阶段完成各科第8章的课程
Sample Input #2:
4 2
Geography:1-3
History:2-4
Sample Output #2:
-1
【数据范围】
对于30%的数据,n,m<=10;
对于50%的数据,n,m<=1000;
对于100%的数据,n,m<=100000。

【问题描述】
OIBH运来一批装备(鼠标和键盘)。

DaoThree要把这些装备分配给moderator们(每人一个鼠标,一个键盘)。

可是问题来了……
这些装备的型号不相同,把一个m型的键盘和一个n型的鼠标分配给一个moderator得到的不满意值为(m-n)^2(每个moderator当然希望自己得到的装备是同一型号的)。

你的任务就是帮帮DaoThree把a个键盘和b个鼠标分配给n个moderator。

使他们的不满意值之和最小。

【输入格式】
输入文件中的第一行:三个正整数n,a,b(1<=n<=a,b<=80)。

第二行:a个数表示每个键盘的型号。

第三行:b个数表示每个鼠标的型号。

0<=型号值<=10000。

【输出格式】
输出文件中仅一个数,即最小不满意值。

【输入输出样例】
输入1:
2 3 3
9 10 20
0 10 11
输出1:
2
输入2:
3 4 4
3 9 7 4
4 2
5 5
输出2:
5
【数据范围】
对于30%的数据n<=10,a,b<=30;
对于100%的数据n<=75,a,b<=80。

【问题描述】
一个被分为n×m个格子的糖果盒,第i行第j列位置的格子里面有a[i][j]颗糖。

本来tenshi打算送这盒糖果给某PPMM的,但是就在要送出糖果盒的前一天晚上,一只极其可恶的老鼠夜袭糖果盒,有部分格子被洗劫并且穿了洞。

tenshi必须尽快从这个糖果盒里面切割出一个矩形糖果盒,新的糖果盒不能有洞,并且tenshi希望保留在新糖果盒内的糖的总数尽量多。

任务:请帮tenshi设计一个程序计算一下新糖果盒最多能够保留多少糖果。

【输入格式】
输入文件中的第一行有两个整数n,m(1<=n,m<=300)。

第i+1行的第j个数表示a[i][j](0<=a[i][j]<=255),如果这个数为0,则表示这个位置的格子被洗劫过。

【输出格式】
输出文件中为最大糖果数。

【输入输出样例】
输入:
3 4
1 2 3 4
5 0
6 3
10 3 4 0
输出:
17
注意:10 3 4这个矩形的糖果数最大。

能量项链
【问题描述】
在Mars星球上,每个Mars人都随身佩带着一串能量项链。

在项链上有N颗能量珠。

能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数。

并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定等于后一颗珠子的头标记。

因为只有这样,通过吸盘(吸盘是Mars人吸收能量的一种器官)的作用,这两颗珠子才能聚合成一颗珠子,同时释放出可以被吸盘吸收的能量。

如果前一颗能量珠的头标记为m,尾标记为r,后一颗能量珠的头标记为r,尾标记为n,则聚合后释放的能量为m×r×n(Mars单位),新产生的珠子的头标记为m,尾标记为n。

需要时,Mars人就用吸盘夹住相邻的两颗珠子,通过聚合得到能量,直到项链上只剩下一颗珠子为止。

显然,不同的聚合顺序得到的总能量是不同的,请你设计一个聚合顺序,使一串项链释放出的总能量最大。

例如:设N=4,4颗珠子的头标记与尾标记依次为(2,3)(3,5)(5,10)(10,2)。

我们用记号⊕表示两颗珠子的聚合操作,(j⊕k)表示第j,k两颗珠子聚合后所释放的能量。

则第4、1两颗珠子聚合后释放的能量为:
(4⊕1)=10*2*3=60。

这一串项链可以得到最优值的一个聚合顺序所释放的总能量为:
((4⊕1)⊕2)⊕3)=10*2*3+10*3*5+10*5*10=710。

【输入格式】
输入文件中的第一行是一个正整数N(4<=N<=100),表示项链上珠子的个数。

第二行是N个用空格隔开的正整数,所有的数均不超过1000。

第i个数为第i颗珠子的头标记(1<=i<=N),当i<N时,第i颗珠子的尾标记应该等于第i+1颗珠子的头标记。

第N颗珠子的尾标记应该等于第1颗珠子的头标记。

至于珠子的顺序,你可以这样确定:将项链放到桌面上,不要出现交叉,随意指定第一颗珠子,然后按顺时针方向确定其他珠子的顺序。

【输出格式】
输出文件中只有一行,是一个正整数E(E<=2.1*109),为一个最优聚合顺序所释放的总能量。

【输入输出样例】
输入:
4
2 3 5 10
输出:
710。

相关文档
最新文档