题目描述

丁丁最近沉迷于一个数字游戏之中。这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易。游戏是这样的,在你面前有一圈整数(一共\(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\)行每行有个整数,其绝对值\(≤10^4\),按顺序给出圈中的数字,首尾相接。

输出格式

输出文件有\(2\)行,各包含\(1\)个非负整数。第\(1\)行是你程序得到的最小值,第\(2\)行是最大值。

输入 #1

4 2

4

3

-1

2

输出 #1

7

81

分析

对于这种数据,我这种蒟蒻都能看出来,相信很多dalao看到都能一眼就看出来要把环换成链,这是第一个思想。

然后第二个思想就是取模的问题,由于负数取模应为正,假设这个数为\(n\),我们就可以写一个函数来进行取模运算,也就是\((n\%10+10)\%10\),为什么要这么处理呢,这样就可以把负数取完模变为正,而对于正数就毫无影响,这是一个比较巧妙也重要的处理。

第三个就是前缀和,因为要求和,所以利用前缀和就可以很大的提高效率,思想也会比较明了。

根据dp思想,我们就可以进行状态转移。开一个\(dp\)数组,\(dp[i][j][len]\)代表从\(i\)到\(j\)分成\(len\)段的大小,依次枚举段数,左右端点,和断点,每一次从\(i\)到\(j\)都是由上一个从\(i\)到断点\(c\)分成\(len-1\)段的状态转移而来,转移的过程就是乘上从\(j\)到\(c\)的前缀和取模。我们令取模的函数为\(Mod\),那么状态转移方程如下:(最大值和最小值一样,唯一要注意的是,最大值初始为\(0\),最小值每一次转移要改为\(0x3f3f3f3f\))

\[f1[l][r][len] = min(f1[l][r][len],f1[l][k][len-1]*Mod(sum[r]-sum[k]));\\
f2[l][r][len] = max(f2[l][r][len],f2[l][k][len-1]*Mod(sum[r]-sum[k]));\]

最终再从头到尾扫一遍得结果。

代码

#include<bits/stdc++.h>
using namespace std;
int Mod(int x){//取模优化
return (x%10+10)%10;
}
int n,m;
const int maxn = 105;
int sum[maxn],a[maxn];
int f1[maxn][maxn][10],f2[maxn][maxn][10];
int main(){
cin>>n>>m;
for(int i=1;i<=n;++i){
cin>>a[i];
a[i+n] = a[i];//环变链
}
for(int i=1;i<=2*n;++i){//求前缀和
sum[i] = sum[i-1]+a[i];
}
for(int i=1;i<=2*n;++i){//初始化,分1段时的值
for(int j=1;j<=2*n;++j){
f1[i][j][1] = f2[i][j][1] = Mod(sum[j] - sum[i-1]);
}
}
for(int len=2;len<=m;++len){//枚举分成多少段
for(int l=1;l<=n;++l){//枚举左端点
for(int r=l+len-1;r<=l+n-1;++r){//枚举右端点
f1[l][r][len]=0x3f3f3f3f;//求最小值初始化
for(int k=l+len-2;k<r;++k){//枚举断点
f1[l][r][len] = min(f1[l][r][len],f1[l][k][len-1]*Mod(sum[r]-sum[k]));
f2[l][r][len] = max(f2[l][r][len],f2[l][k][len-1]*Mod(sum[r]-sum[k])); }
}
}
}
int Max = f2[1][n][m];
int Min = f1[1][n][m];
for(int i=1;i<=n;++i){//从头到尾扫一边
Max = max(Max,f2[i][i+n-1][m]);
Min = min(Min,f1[i][i+n-1][m]);
}
cout<<Min<<endl<<Max<<endl;
//Vocanda }

[区间+线性dp]数字游戏的更多相关文章

  1. 洛谷 P1043 数字游戏 区间DP

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

  2. 「区间DP」「洛谷P1043」数字游戏

    「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...

  3. 【dp】数字游戏&寒假祭

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

  4. NOIP2003pj数字游戏[环形DP]

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

  5. LightOJ1044 Palindrome Partitioning(区间DP+线性DP)

    问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时 ...

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

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

  7. codevs1085数字游戏(环形DP+划分DP )

    1085 数字游戏  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold     题目描述 Description 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单, ...

  8. 【线性DP】数字三角形

    题目链接 原题链接 题目描述 给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大. 7 3 ...

  9. XDU 1161 - 科协的数字游戏II

    Problem 1161 - 科协的数字游戏II Time Limit: 1000MS   Memory Limit: 65536KB   Difficulty: Total Submit: 112  ...

随机推荐

  1. 分布式事务专题笔记(二)分布式事务解决方案之 2PC(两阶段提交)

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 前面已经了解了分布式事务的基础理论,以理论为基础,针对不同的分布式场景业界常见的解决方案有2PC.TCC ...

  2. Java实现 LeetCode 494 目标和

    494. 目标和 给定一个非负整数数组,a1, a2, -, an, 和一个目标数,S.现在你有两个符号 + 和 -.对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面. 返回可 ...

  3. Java实现 LeetCode 34 在排序数组中查找元素的第一个和最后一个位置

    在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n ...

  4. Java实现蓝桥杯历届试题填字母游戏

    题目描述 小明经常玩 LOL 游戏上瘾,一次他想挑战K大师,不料K大师说: "我们先来玩个空格填字母的游戏,要是你不能赢我,就再别玩LOL了". K大师在纸上画了一行n个格子,要小 ...

  5. Java实现 蓝桥杯 历届试题 大臣的旅费

    问题描述 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首 ...

  6. java实现第六届蓝桥杯机器人数目

    机器人数目 少年宫新近邮购了小机器人配件,共有3类,其中, A类含有:8个轮子,1个传感器 B类含有: 6个轮子,3个传感器 C类含有:4个轮子,4个传感器 他们一共订购了100套机器人,收到了轮子6 ...

  7. CVE¬-2020-¬0796 漏洞复现(本地提权)

    CVE­-2020-­0796 漏洞复现(本地提权) 0X00漏洞简介 Microsoft Windows和Microsoft Windows Server都是美国微软(Microsoft)公司的产品 ...

  8. 呀,葵花宝典![IT项目经理成长晋升记2]

    走出办公室时,老吴让王小白认真看下公司的项目管理体系和质量管理体系培训材料.公司这几年连续通过了ISO质量体系认证,通过了CMMI3,已有一套完整的组织过程体系. 因为从投标开始,到公示,还有一周时间 ...

  9. Mac卸载.net core sdk

    NET Core cli提供了卸载脚本 https://github.com/dotnet/cli/tree/master/scripts/obtain/uninstall dotnet-uninst ...

  10. ubuntu18启动zabbix-agent失败/故障记录

    故障现象 ubuntu 16 升级18 之后 安装了zabbix agent 今天突然agent掉了 上去的时候发现 报错: 后来打算-c 启动然后发现 /usr/sbin/zabbix_agentd ...