codevs 1085
数字游戏 2003年NOIP全国联赛普及组
时间限制: s
空间限制: KB
题目等级 : 黄金 Gold
题解
题目描述 Description
丁丁最近沉迷于一个数字游戏之中。这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易。游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分,各部分内的数字相加,相加所得的m个结果对10取模后再相乘,最终得到一个数k。游戏的要求是使你所得的k最大或者最小。 例如,对于下面这圈数字(n=,m=): - 当要求最小值时,((-) mod )×((+) mod )=×=,要求最大值时,为((++) mod )×(- mod )=×=。特别值得注意的是,无论是负数还是正数,对10取模的结果均为非负值。 丁丁请你编写程序帮他赢得这个游戏。 输入描述 Input Description
输入文件第一行有两个整数,n(≤n≤)和m(≤m≤)。以下n行每行有个整数,其绝对值不大于104,按顺序给出圈中的数字,首尾相接。 输出描述 Output Description
输出文件有两行,各包含一个非负整数。第一行是你程序得到的最小值,第二行是最大值。
样例输入 Sample Input - 样例输出 Sample Output 数据范围及提示 Data Size & Hint
en 分类标签 Tags 点此展开 划分型DP 动态规划 环型DP NOIP全国联赛普及组 大陆地区 2003年
题目
#include<iostream>
#include<cstring>
using namespace std; int n,m;
int minl=0x3f3f,maxl=-;
int fmax[][][],fmin[][][];
int s[]; int mod(int i)
{
if(i>)return i%;
else return (i%+)%;
} int main()
{
cin>>n>>m;
for(int i=;i<=;i++)
for(int j=;j<=;++j)
for(int k=;k<;++k)
fmin[i][j][k]=;
for(int i=;i<=n;++i)
{
cin>>s[i];
s[i+n]=s[i];
}
for(int i=;i<=n*;++i)
s[i]=s[i-]+s[i];
for(int i=;i<=*n;++i)
for(int j=;j<=*n;++j)
fmin[i][j][]=fmax[i][j][]=mod(s[j]-s[i]);
for(int l=;l<=m;++l)
for(int i=;i<=n;++i)
for(int j=i;j<=*n;++j)
for(int k=i+;k<j;++k)
{
fmax[i][j][l]=max(fmax[i][j][l],fmax[i][k][l-]*fmax[k][j][]);
fmin[i][j][l]=min(fmin[i][j][l],fmin[i][k][l-]*fmin[k][j][]);
}
for(int i=;i<=n;++i)
{
minl=min(minl,fmin[i][i+n][m]);
maxl=max(maxl,fmax[i][i+n][m]);
}
cout<<minl<<endl;
cout<<maxl<<endl;
}
代码
是一个典型的划分型DP,递推方程很好写
但是做这个题时要注意几个问题
1、划分的是环,需要断环为链,例如把环1,2,3换成1,2,3,1,2,3
2、维护一个后缀数组,操作方便
3、递推时从前往后推,这点和区间dp截然不同
4、这个题把fmin初始化为0x3f3f3f3f这样很大的数会错误,要换成比较小的数像10000就能过
5、递推时一定要注意边界条件
目前划分型dp还没学习,但是已经见到雏形了,可以与其他dp比较学习
codevs 1085的更多相关文章
- codevs 1085 数字游戏 dp或者暴搜
1085 数字游戏 2003年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单 ...
- Codevs 1085 数字游戏
1085 数字游戏 2003年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 丁丁最近沉迷于一个数字游戏之中 ...
- 数字游戏(codevs 1085)
题目描述 Description 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共 ...
- codevs 3289 花匠
题目:codevs 3289 花匠 链接:http://codevs.cn/problem/3289/ 这道题有点像最长上升序列,但这里不是上升,是最长"波浪"子序列.用动态规划可 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1285 二叉查找树STL基本用法
C++STL库的set就是一个二叉查找树,并且支持结构体. 在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较. set经常会用到迭代器,这里说明一下迭代器:可以类似的把 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
- codevs 1228 苹果树 树链剖分讲解
题目:codevs 1228 苹果树 链接:http://codevs.cn/problem/1228/ 看了这么多树链剖分的解释,几个小时后总算把树链剖分弄懂了. 树链剖分的功能:快速修改,查询树上 ...
随机推荐
- Linux IO乱序
原创翻译,转载请注明出处. 在一些平台,所谓的内存映射I/O在保序执行这方面是没有保障的.在这些平台,驱动写入器负责保证I/O写操作按照预期的顺序写到设备内存映射地址. 代表性的做法是通过读取一个安全 ...
- 玩lua
https://my.oschina.net/wangxuanyihaha/blog/186401
- text-overflow使用文字超多div的宽度或超过在table中<td>
关键字:text-overflow:ellipsis 语法:text-overflow:clip | ellipsis 取值 clip:默认值.不显示省略标记(...),而是简单的裁切. ellips ...
- Div+Css中transparent制作奥运五环
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- WebServer参数长度超出解决
当内容超过了4M会报错 System.Web.Services.Protocols.SoapException: 运行配置文件中指定的扩展时出现异常. ---> System.Web.HttpE ...
- [洛谷P3153] [CQOI2009]跳舞
题目大意:有n个女生,n个男生,每次一男一女跳舞.同一队只会跳一次.每个男孩最多只愿意和k个不喜欢的女孩跳舞,女孩同理.问舞会最多能有几首舞曲? 题解:二分跳了多少次舞,每次重建图,建超级原点和汇点, ...
- nowcoder 提高组模拟赛 选择题 解题报告
选择题 链接: https://www.nowcoder.com/acm/contest/178/B 来源:牛客网 题目描述 有一道选择题,有 \(a,b,c,d\) 四个选项. 现在有 \(n\) ...
- CF869E The Untended Antiquity 解题报告
CF869E The Untended Antiquity 题目描述 \(\text{Adieu l'ami}\). Koyomi is helping Oshino, an acquaintance ...
- bzoj 1977 洛谷P4180 严格次小生成树
Description: 给定一张N个节点M条边的无向图,求该图的严格次小生成树.设最小生成树边权之和为sum,那么严格次小生成树就是边权之和大于sum的最小的一个 Input: 第一行包含两个整数N ...
- Codeforces Round #525 (Div. 2)A. Ehab and another construction problem
A. Ehab and another construction problem 题目链接:https://codeforc.es/contest/1088/problem/A 题意: 给出一个x,找 ...