丁丁最近沉迷于一个数字游戏之中。这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易。游戏是这样的,在你面前有一圈整数(一共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取模的结果均为非负值。 丁丁请你编写程序帮他赢得这个游戏。

样例

样例输入

复制4 2
4
3
-1
2

样例输出

复制7
81

题目分析:首先这是区间dp,其次我们需要枚举我们分的段数,左端点,右端点,然后在左端点和右端点中枚举中间的分段点k。于是就形成了dp[0最小/ 1最大][左端点][右端点][分段数],我们知道当分成i段时,我们必须先分成i - 1段才能有分成i段,所以枚举分段数的循环要放在最外面。

因为这是一个环,所以我们猜去吧破链成环的方法,为了快速计算出左端到右端的和,我们又可以采取前缀和的方法(这两个在区间dp中都比较常用)。

在枚举右端点的时候,并不是简单地左端点加1,因为区间至少要有m个数才能分成m段,所以我们在枚举右端点的下标时,我们用的是l + i - 1到 n, 我们在枚举区间点k时,因为我们要把区间分成l到k,k + 1到r,而且因为我们一共要分成i个区间,但是k的实际意义其实是要建立一个独立的k+1到r区间,所以我们用的是Sum[r] - Sum[k]并不是,Sum[r] - Sum[k - 1],k的起始值应该是l,但是由于l到k可以分成i - 1个段,所以至少有i-1个数才能这样分,所以k的起始值为l + (i - 1) - 1

后面新的“-1”是为了求k的下标,可以自已手动举举例子。

关于mod的方面,我们需要知道在本题中负数的mod有点特殊,我们通过题目中例子的规律推出了取模公式,这个&R也解释不了多少,所以欢迎大家评论区留言

#include <cstdio>
#include <algorithm>
using namespace std ;
const int MAXN = 105 ;
int n, dp[2][MAXN][MAXN][MAXN], a[MAXN], Sum[MAXN], m ;
/*dp[0][l][r][i]表示将l到r分成i个部分的积的最小值dp[1][l][r][i]表示将l到r分成i个部分的积的最大值
*/
int mod(int x)
{return ((x % 10) + 10) % 10 ;
}
int main()
{scanf("%d%d", &n, &m) ;for(int i = 1; i <= n; i ++){scanf("%d", &a[i]) ;a[i + n] = a[i] ;}for(int i = 1; i <= n * 2; i ++) Sum[i] = Sum[i - 1] + a[i] ;for(int i = 1; i <= n * 2; i ++){for(int j = i; j <= n * 2; j ++){dp[1][i][j][1] = dp[0][i][j][1] = mod(Sum[j] - Sum[i - 1]) ;}}for(int i = 2; i <= m; i ++){for(int l = 1; l <= n * 2; l ++){for(int r = l + i - 1; r <= n * 2; r ++){dp[0][l][r][i] = 0x3f3f3f3f ;for(int k = l + i - 1 - 1; k < r; k ++)//将l到r分割成l到k,k+1到r {dp[0][l][r][i] = min(dp[0][l][k][i - 1] * mod(Sum[r] - Sum[k]), dp[0][l][r][i]) ;dp[1][l][r][i] = max(dp[1][l][k][i - 1] * mod(Sum[r] - Sum[k]), dp[1][l][r][i]) ;}}}}int ans0 = 0x3f3f3f3f, ans1 = 0 ;for(int i = 1; i <= n; i ++){int j = i + n - 1 ;ans0 = min(ans0, dp[0][i][j][m]) ;ans1 = max(ans1, dp[1][i][j][m]) ;}printf("%d\n%d", ans0, ans1) ;
}

数字游戏(区间dp)相关推荐

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

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

  2. 圆桌游戏(区间DP)

    2.圆桌游戏 (game.cpp/c/pas) [问题描述] 有一种圆桌游戏是这样进行的:n个人围着圆桌坐成一圈,按顺时针顺序依次标号为1号至n号.对1<=i<=n的i来说,i号的左边是i ...

  3. 【区间DP+高精】codevs1166 矩阵取数游戏题解

    转自: [ametake版权所有]http://blog.csdn.net/ametake欢迎来看 http://blog.csdn.net/ametake/article/details/47664 ...

  4. 【日常学习】【区间DP+高精】codevs1166 矩阵取数游戏题解

    题目来自NOIP2007TG3 如果在考场上我现在已经歇菜了吧 今天一整天的时间全部投在这道题上,收获不小. 先上题目 题目描述 Description [问题描述] 帅帅经常跟同学玩一个矩阵取数游戏 ...

  5. 计蒜客 2020 蓝桥杯省赛 B 组模拟赛(五)E区间dp H 裴蜀 J dp A-J 权值线段树

    题目链接 因为要去笔试.所以只打了两个小时,有点求快,很多细节没写好就匆匆交,而且没有检查,打的有点菜 C-煎牛排 做法: 所有的面的个数sum=2*n   然后sum/(2*k)即可. ans=ma ...

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

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

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

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

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

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

  9. Leetcode1690. 石子游戏 VII[C++题解]:带有博弈论的区间dp

    文章目录 题目分析 状态表示 状态转移 题目链接 题目分析 补充博弈论的做题想法:让最坏情况下最好.在很多决策中,考虑所有的最坏情况,选其中最好的一个. 本题分析: 刚开始因为是个贪心题目,两个人每次 ...

最新文章

  1. eclipse 使用lombok 精简java bean
  2. roads 构筑极致用户体验_智美双极 引领旗舰 亚洲龙探索革新的高品质体验
  3. 【转】java 自动装箱与拆箱
  4. MVC中使用ajax传递json数组
  5. 美国大学计算机专业排名2014,2014年美国大学本科计算机专业排名
  6. 企业级网络建站工作室源码
  7. 国内首个 App SDK 国家标准成功立项;苹果意外泄露iPhone 12发布时间;TypeScript 4.0 发布| 极客头条
  8. 网页特效代码大全网址
  9. C#中获取本机IP地址,子网掩码,网关地址
  10. Linux基础三(软件安装管理)
  11. 欢迎来到德莱联盟(一)
  12. 顺序表和链表的优缺点
  13. 为什么存png还有白色底_为什么导出png还是有白底
  14. 操作系统饥饿现象_操作系统
  15. IDEA做数据库操作时的一个莫名其妙的错误
  16. 每日一个小技巧:1招教你提取伴奏怎么做
  17. egg 添加 samesite=none, 出现感叹号
  18. 〖Python 数据库开发实战 - Redis篇⑫〗- Redis的事务特性
  19. oracle数据库27043,在线考试系统(论文).doc
  20. 如何给普通人解释机器学习是什么

热门文章

  1. 阻抗匹配—定义、方式、应用场景
  2. 数学之美_马尔科夫模型01
  3. 韩国又一感人MV《我知道的》
  4. 阴阳师同服务器不同系统,阴阳师跨系统转角色怎么转?跨系统转介绍服务介绍!...
  5. OSChina 周三乱弹 —— 就算登顶程序员的键盘王座
  6. 深度相机中提取深度信息
  7. easyUI-textbox回车获取不到正确的textbox值问题
  8. NCURSES库的使用
  9. uniapp 实现APP设置获取缓存清理缓存
  10. No cache or cacheManager properties have been set. Authorization cache cannot be obtained.