P1043 数字游戏

Posted 心之所向 素履以往

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1043 数字游戏相关的知识,希望对你有一定的参考价值。

                                            P1043 数字游戏

 

题目描述

丁丁最近沉迷于一个数字游戏之中。这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易。游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分,各部分内的数字相加,相加所得的m个结果对10取模后再相乘,最终得到一个数k。游戏的要求是使你所得的k最大或者最小。

例如,对于下面这圈数字(n=4,m=2):

技术分享

要求最小值时,((2-1) mod 10)×((4+3) mod 10)=1×7=7,要求最大值时,为((2+4+3) mod 10)×(-1 mod 10)=9×9=81。特别值得注意的是,无论是负数还是正数,对10取模的结果均为非负值。

丁丁请你编写程序帮他赢得这个游戏。

输入输出格式

输入格式:

 

输入文件第一行有两个整数,n(1≤n≤50)和m(1≤m≤9)。以下n行每行有个整数,其绝对值不大于104,按顺序给出圈中的数字,首尾相接。

 

输出格式:

 

输出文件有两行,各包含一个非负整数。第一行是你程序得到的最小值,第二行是最大值。

 

输入输出样例

输入样例#1:
4 2
4
3
-1
2
输出样例#1:
7
81


区间Dp(蒟蒻我第一眼还想用搜索)
f[i][j] 代表前i个数分成了j份的最大值
g[i][j] 则为最小值

转移并不难想 f[i][j] 一定由f[k][j-1] 转移而来
k为某一断点
g[i][j]同理
和用前缀和来表示 降低复杂度

技术分享
 1 #include <cstdio>
 2 #include <cctype>
 3 
 4 const int MAXN=210;
 5 const int INF=0x3f3f3f3f;
 6 
 7 int n,k,MX,MN;
 8 
 9 int sum[MAXN],f[MAXN][MAXN],g[MAXN][MAXN],a[MAXN];
10 
11 inline void read(int&x) {
12     int f=1;register char c=getchar();
13     for(x=0;!isdigit(c);c==-&&(f=-1),c=getchar());
14     for(;isdigit(c);x=x*10+c-48,c=getchar());
15     x=x*f;
16 }
17 
18 inline int max(int a,int b) {
19     return a<b?b:a;
20 }
21 
22 inline int min(int a,int b) {
23     return a<b?a:b;
24 }
25 
26 inline void dp(int*e) {
27     for(register int i=1;i<=n;++i) sum[i]=sum[i-1]+e[i];
28     for(register int i=0;i<=n;++i)
29       for(register int j=0;j<=k;++j) 
30         f[i][j]=0,g[i][j]=INF;
31         
32     for(register int i=1;i<=n;++i) g[i][1]=f[i][1]=(sum[i]%10+10)%10;
33     for(register int j=2;j<=k;++j)
34       for(register int i=j;i<=n;++i)
35         for(register int k=j-1;k<=i-1;++k)  {
36               f[i][j]=max(f[i][j],f[k][j-1]*(((sum[i]-sum[k])%10+10)%10));
37               g[i][j]=min(g[i][j],g[k][j-1]*(((sum[i]-sum[k])%10+10)%10));
38         }
39     
40     MX=max(MX,f[n][k]);
41     MN=min(MN,g[n][k]);
42     return;
43 }
44 
45 int hh() {
46     read(n);read(k);
47     for(register int i=1;i<=n;++i) scanf("%d",&a[i]),a[i+n]=a[i];
48     MN=INF;
49     for(register int i=0;i<n;++i) dp(a+i);
50     printf("%d\n%d\n",MN,MX);
51     return 0;
52 }
53 
54 int sb=hh();
55 int main() {;}
代码

 

以上是关于P1043 数字游戏的主要内容,如果未能解决你的问题,请参考以下文章

洛谷P1043 数字游戏

「题目代码」P1039~P1043(Java)

LeetCode810. 黑板异或游戏/455. 分发饼干/剑指Offer 53 - I. 在排序数组中查找数字 I/53 - II. 0~n-1中缺失的数字/54. 二叉搜索树的第k大节点(代码片段

猜数字小游戏

P1043 查找小于x的最大元素

从片段调用 Google Play 游戏服务