【动态规划】Mathematical Curse
【来源】:2018年焦作网络赛B
【题意】:
有n个数字,有m个符号运算。通过不回头(即选取m个数有顺序可言),消除巫术的,并达到最大的价值。
其实意思就是在数组里选取一段子序列,然后进行m次加减乘除的运算。最后使答案最大化。
【思路】:
考虑DP,我们考虑加减时只需要考虑最大值即可,但是乘除两个运算的加入就会使这个题目变得复杂了。
然后我们需要的记录最大值和最小值,因为每一个值可能是从最大值转移过来,也有可能最小值转移过来的。
所以需要同时记录。
【注意】:
1、记得初始化(多组数据)
2、如果直接转移会耗费O(n^2),其实我们只是关心前i个里面获取的最大值,所以我们需要压缩,从前一个数字的暂存值进行更新。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e4+;
const int M = ;
const ll inf = 0x7fffffffffffffff;
ll dp[N][M][]; //0_ 最小值 ,1 最大值
ll a[N];
int main(){
int T;
int n,m,k;
char opt[M] ;
for( scanf("%d",&T) ; T ;T-- ){
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=n;i++) scanf("%lld",&a[i]);
scanf("%s",opt+); for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
dp[i][j][] = inf ;
dp[i][j][] = -inf ;
}
} for(int i=;i<=n;i++){
dp[i][][] = dp[i][][] = k;
} for(int j=;j<=m;j++){
for(int i=;i<=n;i++){
if( i > j ){
dp[i][j][] = dp[i-][j][];
dp[i][j][] = dp[i-][j][];
} if( opt[j] =='+'){
dp[i][j][] = min( dp[i][j][] , dp[i-][j-][] + a[i] );
dp[i][j][] = min( dp[i][j][] , dp[i-][j-][] + a[i] ); dp[i][j][] = max( dp[i][j][] , dp[i-][j-][] + a[i] );
dp[i][j][] = max( dp[i][j][] , dp[i-][j-][] + a[i] );
}else if( opt[j] == '-'){
dp[i][j][] = min( dp[i][j][] , dp[i-][j-][] - a[i] );
dp[i][j][] = min( dp[i][j][] , dp[i-][j-][] - a[i] ); dp[i][j][] = max( dp[i][j][] , dp[i-][j-][] - a[i] );
dp[i][j][] = max( dp[i][j][] , dp[i-][j-][] - a[i] );
}else if( opt[j] == '*' ){
dp[i][j][] = min( dp[i][j][] , dp[i-][j-][] * a[i] );
dp[i][j][] = min( dp[i][j][] , dp[i-][j-][] * a[i] ); dp[i][j][] = max( dp[i][j][] , dp[i-][j-][] * a[i] );
dp[i][j][] = max( dp[i][j][] , dp[i-][j-][] * a[i] );
}else{
dp[i][j][] = min( dp[i][j][] , dp[i-][j-][] / a[i] );
dp[i][j][] = min( dp[i][j][] , dp[i-][j-][] / a[i] ); dp[i][j][] = max( dp[i][j][] , dp[i-][j-][] / a[i] );
dp[i][j][] = max( dp[i][j][] , dp[i-][j-][] / a[i] );
}
}
} printf("%lld\n",dp[n][m][]);
}
return ;
}
【动态规划】Mathematical Curse的更多相关文章
- ACM-ICPC2018焦作网络赛 Mathematical Curse(dp)
Mathematical Curse 22.25% 1000ms 65536K A prince of the Science Continent was imprisoned in a cast ...
- ACM-ICPC 2018 焦作赛区网络预赛 B题 Mathematical Curse
A prince of the Science Continent was imprisoned in a castle because of his contempt for mathematics ...
- ACM-ICPC 2018 焦作赛区网络预赛 B Mathematical Curse(DP)
https://nanti.jisuanke.com/t/31711 题意 m个符号必须按顺序全用,n个房间需顺序选择,有个初始值,问最后得到的值最大是多少. 分析 如果要求出最大解,维护最大值是不能 ...
- 2018焦作网络赛Mathematical Curse
题意:开始有个数k,有个数组和几个运算符.遍历数组的过程中花费一个运算符和数组当前元素运算.运算符必须按顺序花费,并且最后要花费完.问得到最大结果. 用maxv[x][y]记录到第x个元素,用完了第y ...
- 2018 ACM 网络选拔赛 焦作赛区
A. Magic Mirror #include <cstdio> #include <cstdlib> #include <cmath> #include < ...
- ACM-ICPC 2018 焦作赛区网络预赛 Solution
A. Magic Mirror 水. #include <bits/stdc++.h> using namespace std; int t; ]; inline bool work() ...
- ACM-ICPC 2018 焦作赛区网络预赛
这场打得还是比较爽的,但是队友差一点就再过一题,还是难受啊. 每天都有新的难过 A. Magic Mirror Jessie has a magic mirror. Every morning she ...
- [Reinforcement Learning] 动态规划(Planning)
动态规划 动态规划(Dynamic Programming,简称DP)是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法. 动态规划常常适用于具有如下性质的问题: 具有最优子结构(Opt ...
- 焦作网络赛B-Mathematical Curse【dp】
A prince of the Science Continent was imprisoned in a castle because of his contempt for mathematics ...
随机推荐
- Codeforces 869E. The Untended Antiquity (二维Fenwick,Hash)
Codeforces 869E. The Untended Antiquity 题意: 在一张mxn的格子纸上,进行q次操作: 1,指定一个矩形将它用栅栏围起来. 2,撤掉一个已有的栅栏. 3,询问指 ...
- shell 里的正则
#!/bin/bash variable="This is a fine mess." echo "$variable" # Regex matching wi ...
- 必懂知识——HashMap的实现原理
HashMap的底层数据结构 1.7之前是:数组+链表 数组的元素是Map.Entiry对象 当出现哈希碰撞的时候,使用链表解决, 先计算出key对应的数组的下标,这个数组的这个位置上为空,直接放入, ...
- csp-s模拟84
T1: 考虑如何能按顺序生成光滑数.对每个质数用队列维护包含此质数的候选集合,每次从所有队首取出最小的作为一个光滑数,用每个质数乘上这个光滑数并加入相应候选集合.这样不会漏掉一个光滑数,但会有重复.比 ...
- Linux 常用命令安装
系统版本: Centos-7-x86_64-minimal 1. 网络相关 1.1 MTR 跟踪路由,还可以测试丢包率.网络延迟 yum -y install mtr 2. 文件相关 2.1 sz ...
- mysql主从复制原理及步骤
原理: 1master开启bin-log功能,日志文件用于记录数据库的读写增删2需要开启3个线程,master IO线程,slave开启 IO线程 SQL线程,3Slave 通过IO线程连接maste ...
- linux中安装python
1.首先切换目录 大型的软件一定要安装在/ opt中 规范 cd /opt 2.下载python3的源码 wget https://www.python.org/ftp/python/3.6.2/P ...
- 如何修改Zend Studio代码字体和大小
Zend Studio的默认字体非常小,看起来很费神,这里教大家怎么修改它的字体和大小. 工具/原料 Zend Studio 方法/步骤 Window-->preferences ...
- 【JVM学习笔记】Class.forName方法学习
三个参数的版本的源代码如下 doc文档翻译 使用给定的类加载器(即第3个参数)返回与具有给定字符串名称(第1个参数)的类或接口关联的Class对象.给定类或接口的完全限定名称(以getName返回的相 ...
- 上传NUnit的单元测试结果和OpenCover的单元测试覆盖率到SonarQube服务中
SonarQube.Scanner.MSBuild.exe begin /k:"OMDCCQuotes" /d:sonar.host.url="http://myip:9 ...