1085 数字游戏

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold

题目描述 Description

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

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

2

4                           -1

3

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

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

输入描述 Input Description

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

输出描述 Output Description

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

样例输入 Sample Input

4 2

4

3

-1

2

样例输出 Sample Output

7

81

/*
这道题是典型的环形DP+划分DP
我们设f[i][j]为前i个数分成j份得到的最大值
g[i][j]表示前i个数分成j份获得的最小值。
于是状态转移方程很容易推出来:f[i][j]=max(f[i][j],f[k][j-1]*(((sum[i]-sum[k])%10+10)%10));
我们枚举一个k端点在1~i-1之间
表示这k个数分成j-1份之后剩下的k+1到i分成一份
所获得的价值用前缀和处理即可。
注意环的处理。
*/#include<iostream>
#include<cstdio>
#include<cstring>using namespace std;
int n,m,Max,Min;
int sum[201],f[200][20],g[200][20],num[201];void dp(int a[])
{for(int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i];for (int i=0; i<=n; i++)    for (int j=0; j<=m; j++){f[i][j]=0;g[i][j]=999999999;}for(int i=1;i<=n;i++)f[i][1]=g[i][1]=(sum[i]%10+10)%10;for(int j=2;j<=m;j++)for(int i=j;i<=n;i++)for(int k=j-1;k<=i-1;k++){f[i][j]=max(f[i][j],f[k][j-1]*(((sum[i]-sum[k])%10+10)%10));g[i][j]=min(g[i][j],g[k][j-1]*(((sum[i]-sum[k])%10+10)%10));}Max=max(Max,f[n][m]);   Min=min(Min,g[n][m]);
}int main()
{Max=0;Min=999999999;scanf("%d%d",&n,&m);for (int i=1; i<=n; i++){scanf("%d",&num[i]);num[i+n]=num[i];    }for (int i=0; i<n; i++) dp(num+i); printf("%d\n%d\n",Min,Max);return 0;
}

心若向阳,无言悲伤

转载于:https://www.cnblogs.com/L-Memory/p/6351815.html

codevs1085数字游戏(环形DP+划分DP )相关推荐

  1. LOJ #10166. 「一本通 5.3 练习 1」数字游戏

    题目:数字游戏 思路:数位dp 代码: #include<bits/stdc++.h> using namespace std;int a,b,n; int c[20]; int dp[2 ...

  2. codevs 1085 数字游戏 dp或者暴搜

    1085 数字游戏 2003年NOIP全国联赛普及组  时间限制: 1 s  空间限制: 128000 KB 题目描述 Description 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁 ...

  3. 【DP】数字游戏(jzoj 2131)

    数字游戏 jzoj 2131 题目大意: 有n个数,每个数有相应的aia_iai​和bib_ibi​,当选了一个数后结果加上aia_iai​,其他数分别减去他们自己的aja_jaj​,现在让你选m个数 ...

  4. 数字游戏——数位dp问题

    数字游戏 数位dp思路: 首先考虑第一个数字能填什么,预处理第一个数字能填的数(除去边界),然后去判断边界,即让循环往下走. 代码 #include <iostream> #include ...

  5. 数字游戏(区间dp)

    丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分 ...

  6. #10166. 「一本通 5.3 练习 1」数字游戏【数位 DP】

    题目描述 由于科协里最近真的很流行数字游戏,某人又命名了一种取模数,这种数字必须满足各位数字之和 mod N为 0.现在大家又要玩游戏了,指定一个整数闭区间 [a,b],问这个区间内有多少个取模数. ...

  7. 不止代码:乘法游戏 题解(区间dp)

    题目描述 乘法游戏是在一行牌上进行的.每一张牌包括了一个正整数.在每一个移动中,玩家拿出一张牌,得分是用它的数字乘以它左边和右边的数,所以不允许拿第1张和最后1张牌.最后一次移动后,这里只剩下两张牌. ...

  8. Newcoder 110 E.Pocky游戏(状压DP)

    Description 社交活动中有nnn个男孩和nnn个女孩. 他们玩的其中一场比赛是通过pockypockypocky传递橡皮筋(pockypockypocky是一种长条饼干). 与正常的社交活动 ...

  9. 剑指Offer - 面试题46. 把数字翻译成字符串(DP)

    1. 题目 给定一个数字,我们按照如下规则把它翻译为字符串: 0 翻译成 "a" , 1 翻译成 "b",--, 11 翻译成 "l",-- ...

最新文章

  1. c++ windows获得当前工作目录文件_基于linux下Python文件操作
  2. 关于Android中的onCreate()多次被调用导致bindService被多次调用的问题...
  3. Android开发学习笔记(二)——编译和运行原理(2)
  4. ELK:kibana使用的lucene查询语法
  5. unity---------------------关于BuildAssetBundles的使用(打包)
  6. 【实用工具】windows/linux下时间统计函数
  7. Windows下的git配置
  8. Shell脚本编程之(三)执行方式差异(source, sh script, ./script)
  9. Mysql事务,并发问题,锁机制
  10. 技嘉Z370 HD3P + i7-8700K + GTX1080 装黑苹果 High Sierra 10.13.6
  11. PS之PS 删除时出现无法完成请求,因为智能对象不能直接进行编辑。
  12. 微信小程序富文本编辑器 editor 组件源码
  13. RNA测序相对基因表达芯片有什么优势?
  14. 2021高考北京大峪中学成绩查询,2014年北京市各区高考成绩汇总
  15. 英语语法回顾7——状语从句特殊用法
  16. 网站中的PV是什么意思?
  17. DEVC++第五人格V2.0
  18. 分析网站如何检测已经登录的QQ帐号
  19. python中round函数的精度保留方法---四舍六入五成双
  20. bandgap基本知识(转载)

热门文章

  1. python需要缩进的块_“需要缩进块”
  2. 基础的c语言题目,几个c语言的基础题目
  3. 使用echarts(一) 第一次使用echarts
  4. 计算机科学与技术 net,计算机科学与技术
  5. 个人笔记 vue npm redis
  6. c语言 勒让德多项式,2406: C语言习题 求n阶勒让德多项式(示例代码)
  7. php转型mysql dba_MySQL_DBA整理(转)
  8. java 批量替换字符串_# Java 一步一步实现高逼格的字符串替换工具(二)
  9. 通过官方查看springCloud,springBoot版本对应关系
  10. matlab 三维绘图 抛光,瓷砖抛光过程建模与仿真