洛谷P1043
[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的更多相关文章
- 「区间DP」「洛谷P1043」数字游戏
「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...
- 洛谷 P1043 数字游戏(区间dp)
题目链接:https://www.luogu.com.cn/problem/P1043 这道题与石子合并很类似,都是把一个环强制改成一个链,然后在链上做区间dp 要初始化出1~2n的前缀和,方便在O( ...
- 洛谷——P1043 数字游戏
https://www.luogu.org/problem/show?pid=1043 题目描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要 ...
- 洛谷P1043 数字游戏
题目描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分 ...
- 洛谷P1043数字游戏
题目 区间DP,将\(maxn[i][j][k]\)表示为i到j区间内分为k个区间所得到的最大值,\(minn\)表示最小值. 然后可以得到状态转移方程: \[maxn[i][j][k]= max(m ...
- 洛谷 P1043 数字游戏
题目传送门 解题思路: 跟石子合并差不多,区间DP(环形),用f[i][j][s]表示从i到j分成s段所能获得的最大答案,枚举断点k,则f[i][j][s] = min(f[i][j][s],f[i] ...
- 洛谷 P1043 数字游戏 区间DP
题目描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分 ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
随机推荐
- Splashtop Enterprise提供全面的远程访问和远程支持解决方案
全球领先的远程访问和远程支持解决方案领导者 Splashtop Inc. 发布了全新的 Splashtop Enterprise ,这是一个全面的远程访问和远程支持解决方案,满足企业的IT人员,服 ...
- 【漏洞复现】金蝶OA-EAS系统 uploadLogo.action 任意文件上传漏洞(0day)
阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站.服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作.利用此文所提供的 ...
- Python提取文本文件(.txt)数据的方法
本文介绍基于Python语言,遍历文件夹并从中找到文件名称符合我们需求的多个.txt格式文本文件,并从上述每一个文本文件中,找到我们需要的指定数据,最后得到所有文本文件中我们需要的数据的合集的方法 ...
- mysql 命令行安装方式
一:下载 先到 mysql 官方网站下载:https://dev.mysql.com/downloads/mysql/ 点击直接下载: 解压到目录:D:\mysql-8.0.19-winx64 如图 ...
- Django——启动项目时报错mysqlclient
报错内容如下: Watching for file changes with StatReloader Exception in thread django-main-thread: Tracebac ...
- 人脸识别库 虹软 客户端 服务端 示例 基于虹软SDK在C/S 模式下的多人脸实时识别(C#)
https://github.com/18628271760/MultipleFacesProcess 一.前言 虹软开发SDK以来,其免费使用的营销策略,成功降低了中小企业使用人脸识别技术的成本.然 ...
- no implicit conversion of nil into String
一.Cocoapod 执行pod install命令时报错 [!] An error occurred while processing the post-install hook of the Po ...
- OpenCV笔记(10) 相机模型与标定
万圣节快乐! 1. 相机模型 针孔相机模型:过空间某特定点的光线才能通过针孔(针孔光圈),这些光束被投影 到图像平面形成图像. 将图像平面在针孔前方,重新把针孔相机模型整理成另一种等价形式, 实际上, ...
- 基本定时器TIM6实现精确延时
1.基本定时器的特点 (1).16位自动重装载累加计数器 (2).16位可编程(可实时修改)预分频器,用于对输入的时钟按系数为1-65536之间的任意数值 !!!注意基本定时器只有向上计数模式,不要被 ...
- LeetCode 719. 找出第 k 小的距离对 (Java)
题目: 给定一个整数数组,返回所有数对之间的第 k 个最小距离.一对 (A, B) 的距离被定义为 A 和 B 之间的绝对差值. 示例 1: 输入:nums = [1,3,1]k = 1输出:0 解释 ...