数字游戏(NOIP 2003 PJT2)

一 原始数据处理
1.输入数据得到a[1]~a[n],复制扩展a[n+1]~a[2*n],以便处理不同点为起点出发。 cin>>n>>m;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
a[i+n]=a[i];
}
2.计算前缀和
sum[1]=a[1];
for(int i=2;i<=2*n;i++) sum[i]=sum[i-1]+a[i];
3.除余计算函数
int mod10(int k)
{
return (k%10+10)%10;
}
二 dp数组定义及转移方程
1 dp定义
dpma [i][j][m] 表示i为起点j为终点,划分m份的最大值;
dpmi [i][j][m] 表示i为起点j为终点,划分m份的最小值;
2 根据定义初始化
dpma [i][j][1];
dpmi [i][j][1];
for(int i=1;i<=2*n;i++)
{
for (int j=i;j<=2*n;j++)
{
dpmi[i][j][1]=dpma[i][j][1]=mod10(sum[j]-sum[i-1]);
for(int len=2;len<=m;len++)
{
dpmi[i][j][len]=2e9;
dpma[i][j][len]=0;
}
}
}
3转移方程: dpma[i][j][len]=max(1ll*dpma[i][mid][num]*dpma[mid+1][j][len-num],1ll*dpma[i][j][len]));
dpmi[i][j][len]=min(1ll*dpmi[i][mid][num]*dpmi[mid+1][j][len-num],1ll*dpmi[i][j][len])); len 范围[2,m],最外层循环,用来遍历所有分的份数(因为份数为1的都已初始化)
num是分堆数量取值范围[1,len-1],用来遍历len堆的方法,len=5,那么num可分成1,4;2,3;3,2;4,1;
i的范围[1,2*n],j的范围[i,2*n],用来遍历起始点。
mid为i~j之间的划分点 ,mid 取值范围[i,j-1]
举例说明mid的必要性,样例a[]={2,-1,3,4},
求dp[1][3][2],
存在{2},{-1,3}和{2,-1},{3}按照划mid分点不同存在两种情况,
应比较dp[1][1][1]*dp[2][3][1]和dp[1][2][1]*dp[3][3][1]两者取大
防止dpmi超int界,乘1ll转化为长整型 4 求最大最小值
int maxans=0,minans=2e9;
for(int i=1;i<=n;i++)
{
maxans=max(dpma[i][i+n-1][m],maxans);
minans=min(dpmi[i][i+n-1][m],minans);
}
代码:
1 #include<bits/stdc++.h>
2 #define LL long long
3 using namespace std;
4 int dpmi[200][200][200],dpma[200][200][200]={0};
5 int n,m,a[200]={0},sum[200]={0};
6 int mod10(int n)
7 {
8 return (n%10+10)%10;
9 }
10
11 int main()
12 {
13 // freopen("1.in","r",stdin);
14 // freopen("1.out","w",stdout);
15 cin>>n>>m;
16 for(int i=1;i<=n;i++)
17 {
18 scanf("%d",&a[i]);
19 a[i+n]=a[i];
20 }
21
22 sum[1]=a[1];
23 for(int i=2;i<=2*n;i++) sum[i]=sum[i-1]+a[i];
24
25 for(int i=1;i<=2*n;i++)
26 {
27 for(int j=i;j<=2*n;j++)
28 {
29 dpmi[i][j][1]=dpma[i][j][1]=mod10(sum[j]-sum[i-1]);
30 for(int len=2;len<=m;len++)
31 {
32 dpmi[i][j][len]=2e9;
33 dpma[i][j][len]=-1;
34 }
35 }
36 }
37
38
39 for(int len=2;len<=m;len++)
40 {
41 for(int num=1;num<len;num++)
42 {
43 for(int i=1;i<=2*n;i++)
44 {
45 for(int j=i;j<=2*n;j++)
46 {
47 for(int mid=i;mid<=j-1;mid++)
48 {
49 dpma[i][j][len]=max(1ll*dpma[i][mid][num]*dpma[mid+1][j][len-num],1ll*dpma[i][j][len]);
50 dpmi[i][j][len]=min(1ll*dpmi[i][mid][num]*dpmi[mid+1][j][len-num],1ll*dpmi[i][j][len]);
51 }
52 }
53 }
54 }
55 }
56 int maxans=-1000,minans=2e9;
57 for(int i=1;i<=n;i++)
58 {
59 maxans=max(dpma[i][i+n-1][m],maxans);
60 minans=min(dpmi[i][i+n-1][m],minans);
61 }
62 printf("%d\n%d",minans,maxans);
63 return 0;
64 }
数字游戏(NOIP 2003 PJT2)的更多相关文章
- 1085 数字游戏 2003年NOIP全国联赛普及组
丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分 ...
- NOIP 数字游戏
描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m ...
- codevs 1085 数字游戏 dp或者暴搜
1085 数字游戏 2003年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单 ...
- Codevs 1085 数字游戏
1085 数字游戏 2003年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 丁丁最近沉迷于一个数字游戏之中 ...
- 1861 奶牛的数字游戏 2006年USACO
codevs——1861 奶牛的数字游戏 2006年USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题解 题目描述 Descript ...
- C语言猜数字游戏
猜数字游戏,各式各样的实现方式,我这边提供一个实现方式,希望可以帮到新手. 老程序猿就不要看了,黑呵呵 源代码1 include stdio.h include stdlib.h include ti ...
- 不一样的猜数字游戏 — leetcode 375. Guess Number Higher or Lower II
好久没切 leetcode 的题了,静下心来切了道,这道题比较有意思,和大家分享下. 我把它叫做 "不一样的猜数字游戏",我们先来看看传统的猜数字游戏,Guess Number H ...
- java 猜数字游戏
作用:猜数字游戏.随机产生1个数字(1~10),大了.小了或者成功后给出提示. 语言:java 工具:eclipse 作者:潇洒鸿图 时间:2016.11.10 >>>>> ...
- 【原创Android游戏】--猜数字游戏Version 0.1
想当年高中时经常和小伙伴在纸上或者黑板上或者学习机上玩猜数字的游戏,在当年那个手机等娱乐设备在我们那还不是很普遍的时候是很好的一个消遣的游戏,去年的时候便写了一个Android版的猜数字游戏,只是当时 ...
- 【原创Android游戏】--猜数字游戏V1.1 --数据存储,Intent,SimpleAdapter的学习与应用
--------------------------------------------------------------- V0.1版本 上次做完第一个版本后,发现还有一些漏洞,并且还有一些可以添 ...
随机推荐
- java学习之MybBaits
0x00前言 我前面使用的jdbc和jdbc的工具类集成的但是它们在少部分代码的情况下会会简单,但是以后如果项目较大jdbc的固定代码会很难维护,如果使用框架会简单很多,也标志着java学习正式进入到 ...
- 一个基于角色的访问控制(RBAC)的简单示例
关于"基于角色的访问控制"是什么,本文不再赘述,如果不明白,请自行查阅资料了解. 本文参考用户·角色·权限·表的设计的思想设计. 本文用到的技术有Spring Boot.Sprin ...
- mybatis一对多映射分页的问题
一对多可能会出现分页错误 条数不对的问题 解决方法: 将主表分页查询一次 SELECT aa.id,aa.name,bb.name FROM (SELECT * from tab1 ORDER BY ...
- 嵌入式-c语言基础:冒泡排序实现从大到小排列
#include<stdio.h> int main() { /*冒泡排序:从大到小*/ /*i=0 第1轮(i+1):需要比较9次(sizeArr-i-1)*/ /*i=1 第2轮(i+ ...
- 2022年rhce最新认证—(满分通过)
RHCE认证 重要配置信息 在考试期间,除了您就坐位置的台式机之外,还将使用多个虚拟系统.您不具有台式机系统的 root 访问权,但具有对虚拟系统的完整 root 访问权. 系统信息 在本考试期间,您 ...
- 一个宁静祥和没有bug的下午和SqlSession的故事
1 背景 这是一个安静祥和没有bug的下午.作为一只菜鸡,时刻巩固一下基础还是很有必要的,如此的大好时机,就让我来学习学习mybatis如何使用. 这可和我看到的不一样啊,让我来看看项目里怎么写的. ...
- Kafka事务原理剖析
一.事务概览 提起事务,我们第一印象可能就是ACID,需要满足原子性.一致性.事务隔离级别等概念,那kafka的事务能做到什么程度呢?我们首先看一下如何使用事务 Producer端代码如下 Kafka ...
- IDEA git配置
必备:安装Idea \ git配置git坏境:在环境变量中添加git安装包bin目录即可 1.去git官网申请一个账号 https://github.com/ 创建一个新的项目 2.在快速启动栏或者g ...
- Dev-Cpp下载与安装
目录 一.介绍 Dev-Cpp 二.下载 Dev-Cpp 1.通过百度网盘下载 2.通过 SourceForge 官网下载 三.安装 Dev-Cpp 写在结尾的话 免责声明 大家好,这里是 main工 ...
- Vue快速上门(1)-基础知识图文版
VUE家族系列: Vue快速上门(1)-基础知识 Vue快速上门(2)-模板语法 Vue快速上门(3)-组件与复用 01.基本概念 1.1.先了解下MVVM VUE是基于MVVM思想实现的,那什么是M ...