[区间+线性dp]数字游戏
题目描述
丁丁最近沉迷于一个数字游戏之中。这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易。游戏是这样的,在你面前有一圈整数(一共\(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\))
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]数字游戏的更多相关文章
- 洛谷 P1043 数字游戏 区间DP
题目描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分 ...
- 「区间DP」「洛谷P1043」数字游戏
「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...
- 【dp】数字游戏&寒假祭
区间DP 题目描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按 ...
- NOIP2003pj数字游戏[环形DP]
题目描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分 ...
- LightOJ1044 Palindrome Partitioning(区间DP+线性DP)
问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时 ...
- codevs 1085 数字游戏 dp或者暴搜
1085 数字游戏 2003年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单 ...
- codevs1085数字游戏(环形DP+划分DP )
1085 数字游戏 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单, ...
- 【线性DP】数字三角形
题目链接 原题链接 题目描述 给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大. 7 3 ...
- XDU 1161 - 科协的数字游戏II
Problem 1161 - 科协的数字游戏II Time Limit: 1000MS Memory Limit: 65536KB Difficulty: Total Submit: 112 ...
随机推荐
- JavaScript (一) js的介绍及基本语法变量
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.JS 的 介绍 1.JavaScript :简称 : js js 分为三个部分: 1. ECMASc ...
- Java实现 LeetCode 707 设计链表(环形链表)
707. 设计链表 设计链表的实现.您可以选择使用单链表或双链表.单链表中的节点应该具有两个属性:val 和 next.val 是当前节点的值,next 是指向下一个节点的指针/引用.如果要使用双向链 ...
- Java实现 蓝桥杯VIP 算法训练 邮票
算法训练 邮票 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个信封,有N(1≤N≤100)个位置可以贴邮票,每个位置只能贴一张邮票.我们现在有M(M<=100)种不同邮资的邮票 ...
- java实现日程表
[编程题] 某保密单位机要人员 A,B,C,D,E 每周需要工作5天,休息两天. 上级要求每个人每周的工作日和休息日必须是固定的,不能在周间变更. 此外,由于工作需要,还有如下要求: 1. 所有人的连 ...
- Java实现 蓝桥杯 算法提高 扶老奶奶过街
1 问题描述 一共有5个红领巾,编号分别为A.B.C.D.E,老奶奶被他们其中一个扶过了马路. 五个红领巾各自说话: A :我和E都没有扶老奶奶 B :老奶奶是被C和E其中一个扶过大街的 C :老奶奶 ...
- java实现第六届蓝桥杯三角形面积
三角形面积 题目描述 如图1所示.图中的所有小方格面积都是1. 那么,图中的三角形面积应该是多少呢? 请填写三角形的面积.不要填写任何多余内容或说明性文字. 28 简单的数学平面几何问题: 大正方形面 ...
- opencl(7) 内核执行命令入队]工作组、工作项
1:将内核执行命令入队(该命令可被多个工作项执行) cl_int clEnqueueNDRangeKernel( cl_command_queue command_queue, cl_kernel k ...
- 权限系统设计(0):权限系统设计基本概念改需-MAC/RBAC引子
此篇主要对权限系统设计所涉的一些专业术语重点梳理.从我们windows的文件系统 自主访问控制 到基于角色访问控制. 权限设计基本术语 对后面会用到的词汇做一个简要说明 什么是权限(许可) 权限(Pr ...
- iostst
原文链接:https://blog.csdn.net/qq_20332637/article/details/82146753 iostat用于输出CPU和磁盘I/O相关的统计信息,iostat 也有 ...
- node-sass问题
cnpm install node-sass@latest 或者 所以用npm install -g cnpm --registry=https://registry.npm.taobao.org , ...