[NOIP2003 普及组] 数字游戏

题目描述

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

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

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

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

输入格式

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

输出格式

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

样例 #1

样例输入 #1

4 2
4
3
-1
2

样例输出 #1

7
81

提示

【题目来源】

NOIP 2003 普及组第二题

事实证明,当你想不出状态方程时,记忆化搜索是一个不错的思路

//                  (ᗜ ‸ ᗜ)
// 去吧,鸭鸭,把希儿和AC都带回来!
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int INF = 0x3f3f3f3f3f3f3f3f;
int n, m;
int s[105];
int pre[105];
int dp[10][105][105][2];
int minn = INF;
int maxx = -INF;
void dfs(int id, int ls, int rs, int res, int fr)
{ int sum = pre[rs] - pre[ls - 1];
sum = (sum%10+10)%10;
res = res * sum;
int i = rs + 1;
if (id == m)
{
maxx = max(res, maxx), minn = min(res, minn);
return;
}
int flag1 = 0,flag2 = 0; if (dp[id][fr][rs][0] <= res)
{
flag1 = 1;
}
else
dp[id][fr][rs][0] = res;
if (dp[id][fr][rs][1] >= res){
flag2 = 1;
}
else
dp[id][fr][rs][1] = res;
if(flag1 && flag2) return;
if (id == m - 1)
{
dfs(id + 1, i, fr + n - 1, res, fr);
return;
}
for (int j = i; n + fr - j >= m - id; j++){
dfs(id + 1, i, j, res, fr);
}
}
inline int read()
{
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9')
{
if (ch == '-')
f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9')
{
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
inline void print(int x)
{
if (x < 0)
{
putchar('-');
x = -x;
}
if (x > 9)
print(x / 10);
putchar(x % 10 + '0');
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m;
for(int i = 1; i <= m; i++){
for(int j = 1; j <= 2 * n; j++){
for(int k = 1; k <= 2 * n; k++){
dp[i][j][k][0] = INF;
dp[i][j][k][1] = -INF;
}
}
}
for (int i = 1; i <= n; i++)
cin >> s[i], s[i + n] = s[i];
for (int i = 1; i <= 2 * n; i++)
pre[i] = pre[i - 1] + s[i];
if (m == 1)
{
dfs(1, 1, n, 1, 1);
}
else{
for (int i = 1; i <= n; i++)
for (int j = i; n + i - j >= m; j++)
dfs(1, i, j, 1, i);
}
cout << minn << endl;
cout << maxx << endl;
return 0;
}

洛谷P1043的更多相关文章

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

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

  2. 洛谷 P1043 数字游戏(区间dp)

    题目链接:https://www.luogu.com.cn/problem/P1043 这道题与石子合并很类似,都是把一个环强制改成一个链,然后在链上做区间dp 要初始化出1~2n的前缀和,方便在O( ...

  3. 洛谷——P1043 数字游戏

    https://www.luogu.org/problem/show?pid=1043 题目描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要 ...

  4. 洛谷P1043 数字游戏

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

  5. 洛谷P1043数字游戏

    题目 区间DP,将\(maxn[i][j][k]\)表示为i到j区间内分为k个区间所得到的最大值,\(minn\)表示最小值. 然后可以得到状态转移方程: \[maxn[i][j][k]= max(m ...

  6. 洛谷 P1043 数字游戏

    题目传送门 解题思路: 跟石子合并差不多,区间DP(环形),用f[i][j][s]表示从i到j分成s段所能获得的最大答案,枚举断点k,则f[i][j][s] = min(f[i][j][s],f[i] ...

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

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

  8. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  9. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  10. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

随机推荐

  1. [popover, select] el-popover内有select的时候在选择后会自动关闭

    Steps to reproduce 选择某个选项后会自动关闭 What is Expected? 选择后不自动关闭,等点击按钮后再去触发组件内的关闭方法. What is actually happ ...

  2. C 语言编程 — 数据类型转换

    目录 文章目录 目录 前文列表 数据类型转换 隐式(自动)类型转换 常用的算术转换 显式(强制)类型转换 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法& ...

  3. 更智能!AIRIOT加速煤炭行业节能减排升级

    "双碳政策"下,各个行业都在践行节能减排行动,依靠数字化.智能化手段开展节能减排工作. 煤炭行业是能源消耗大户,煤炭选洗是煤炭行业节能减排的重要环节之一,加强煤炭清洁高效利用工作, ...

  4. linux源码编译安装软件原理

    目录 一.关于软件包 二.软件编译过程 三.编译安装常用参数 四.源码编译出错的解决思路 五.各种软件安装方法的特点 一.关于软件包 ​ 在linux中安装软件是需要安装包的,软件的安装包有各种类型: ...

  5. django设置中文和上海时间

    在settings.py配置文件中进行配置: # 设置为中文 LANGUAGE_CODE = 'zh-hans' # 设置 "亚洲/上海" 时区 TIME_ZONE = 'Asia ...

  6. HTML——input标签

    很多表单元素都是由一个个的 input 元素组成的.它是自闭合标签,根据其 type 属性值的不同分为很多种,例如单行文本框.密码框.单选按钮.复选框.隐藏域.文件上传域.普通按钮.提交按钮以及重置按 ...

  7. Android 13 - Media框架(18)- CodecBase

    关注公众号免费阅读全文,进入音视频开发技术分享群! 从这一节开始我们会回到上层来看ACodec的实现,在这之前我们会先了解ACodec的基类CodecBase.CodecBase.h 中除了声明有自身 ...

  8. 来自多彩世界的控制台——C#控制台输出彩色字符画

    引言 看到酷安上有这样一个活动,萌生了用 C# 生成字符画的想法,先放出原图.   酷安手绘牛啤     §1 黑白 将图像转换成字符画在 C# 中很简单,思路大致如下: 加载图像,逐像素提取明度. ...

  9. 如何在Spring Boot中配置MySQL数据库连接数

    1.如何在Spring Boot中配置MySQL数据库的连接数 1.1主要配置 在Spring Boot中配置MySQL数据库连接数通常涉及到两个主要的配置: (1)数据源配置:这通常是在applic ...

  10. Nacos 源码环境搭建

    最近在学习nacos,通过调式源码查看服务注册和发现流程和原理,本地部署naos源码需要一定的步骤,本文主要做nacos源码部署. nacos版本:2.1.1 下载源码 从github上下载源码到本地 ...