SSOJ1245数字游戏(NOIP2003)
2950+
作者:crxis 发布:2017-11-01 分类:划分DP
题目大意:n个数围成一圈,分成m份后各份的和分别模10后再相乘,乘积最大值、最小值分别是多少?
题目描述
丁丁最近沉迷于一个数字游戏之中。这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易。游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分,各部分内的数字相加,相加所得的m个结果对10取模后再相乘,最终得到一个数k。游戏的要求是使你所得的k最大或者最小。
丁丁请你编写程序帮他赢得这个游戏。
输入
输入文件第一行有两个整数,n(1≤n≤50)和m(1≤m≤9)。以下n行每行有个整数,其绝对值不大于104,按顺序给出圈中的数字,首尾相接。
输出
输出文件有两行,各包含一个非负整数。第一行是你程序得到的最小值,第二行是最大值。
样例输入
4 2
4
3
-1
2
样例输出
7
81
提示
DP!^_^
注:本题的数字和对10取模后要取正数。
NOIP2003普及组第二题
解题思路
如果不看圈,那么就是普通的划分型DP;对于一个圈,可以把他拆成链,分别求1到n、2到n+1、3到n+2、……、n到2n-1。程序中f[i][j]表示前j个数分成i份最大乘积是多少;g[i][j]表示前j个数分成i份最小乘积是多少。当然,取模也可以解决环的问题,需要多花些时间思考而已。