焦作网络赛B-Mathematical Curse【dp】
A prince of the Science Continent was imprisoned in a castle because of his contempt for mathematics when he was young, and was entangled in some mathematical curses. He studied hard until he reached adulthood and decided to use his knowledge to escape the castle.
There are NN rooms from the place where he was imprisoned to the exit of the castle. In the i^{th}ith room, there is a wizard who has a resentment value of a[i]a[i]. The prince has MM curses, the j^{th}jth curse is f[j]f[j], and f[j]f[j] represents one of the four arithmetic operations, namely addition('+'), subtraction('-'), multiplication('*'), and integer division('/'). The prince's initial resentment value is KK. Entering a room and fighting with the wizard will eliminate a curse, but the prince's resentment value will become the result of the arithmetic operation f[j]f[j] with the wizard's resentment value. That is, if the prince eliminates the j^{th}jth curse in the i^{th}ith room, then his resentment value will change from xx to (x\ f[j]\ a[i]x f[j] a[i]), for example, when x=1, a[i]=2, f[j]=x=1,a[i]=2,f[j]='+', then xx will become 1+2=31+2=3.
Before the prince escapes from the castle, he must eliminate all the curses. He must go from a[1]a[1] to a[N]a[N] in order and cannot turn back. He must also eliminate the f[1]f[1] to f[M]f[M] curses in order(It is guaranteed that N\ge MN≥M). What is the maximum resentment value that the prince may have when he leaves the castle?
Input
The first line contains an integer T(1 \le T \le 1000)T(1≤T≤1000), which is the number of test cases.
For each test case, the first line contains three non-zero integers: N(1 \le N \le 1000), M(1 \le M \le 5)N(1≤N≤1000),M(1≤M≤5) and K(-1000 \le K \le 1000K(−1000≤K≤1000), the second line contains NN non-zero integers: a[1], a[2], ..., a[N](-1000 \le a[i] \le 1000)a[1],a[2],...,a[N](−1000≤a[i]≤1000), and the third line contains MM characters: f[1], f[2], ..., f[M](f[j] =f[1],f[2],...,f[M](f[j]='+','-','*','/', with no spaces in between.
Output
For each test case, output one line containing a single integer.
样例输入复制
3
2 1 5
2 3
/
3 2 1
1 2 3
++
4 4 5
1 2 3 4
+-*/
样例输出复制
2
6
3
题目来源
题意:
有1-n间房 每间有一个数ai
有1-m个操作fj 每种操作可能是+-*/
有一个初始值k 走到第i个房间如果进行了第j个操作 得到结果k fj ai
房间和操作的顺序不能改变
问最后得到的最大值
思路:
就是一个比较简单的dp 发现自己dp总是写不好
最近不如多练点dp吧
dp[i][j]表示在第i间房做j个操作 i一定是不能小于j
加和减的话比较常规 乘除涉及到负数的话就不一定了
所以需要既存最大值也要存最小值
还要注意初始化的赋值
//#include"pch.h" #include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<vector>
#include<cmath>
#include<cstring>
#include<set>
#include<stack>
//#include<bits/stdc++.h> #define inf 0x3f3f3f3f
using namespace std;
typedef long long LL; const int maxn = ;
int t;
int n, m, k;
int a[maxn];
LL dpmin[maxn][], dpmax[maxn][];
char f[]; int main()
{ scanf("%d", &t);
while (t--) {
memset(dpmax, -inf, sizeof(dpmax));
memset(dpmin, inf, sizeof(dpmin));
//cout<<dpmax[0][0]<<endl<<dpmin[0][0]<<endl;
scanf("%d%d%d", &n, &m, &k);
for (int i = ; i <= n; i++) {
scanf("%d", &a[i]);
}
getchar();
for (int i = ; i <= m; i++) {
scanf("%c", &f[i]);
} for (int i = ; i <= n; i++) {
dpmax[i][] = dpmin[i][] = k;
}
for (int j = ; j <= m; j++) {
for (int i = j; i <= n; i++) {
dpmax[i][j] = dpmax[i - ][j];//第i间不做
dpmin[i][j] = dpmin[i - ][j];
if (f[j] == '+') {
dpmax[i][j] = max(dpmax[i][j], dpmax[i - ][j - ] + a[i]);
dpmin[i][j] = min(dpmin[i][j], dpmin[i - ][j - ] + a[i]);
}
if (f[j] == '-') {
dpmax[i][j] = max(dpmax[i][j], dpmax[i - ][j - ] - a[i]);
dpmin[i][j] = min(dpmin[i][j], dpmin[i - ][j - ] - a[i]);
}
if (f[j] == '*') {
dpmax[i][j] = max(dpmax[i][j], dpmax[i - ][j - ] * a[i]);
dpmax[i][j] = max(dpmax[i][j], dpmin[i - ][j - ] * a[i]);
dpmin[i][j] = min(dpmin[i][j], dpmax[i - ][j - ] * a[i]);
dpmin[i][j] = min(dpmin[i][j], dpmin[i - ][j - ] * a[i]);
}
if (f[j] == '/') {
dpmax[i][j] = max(dpmax[i][j], dpmax[i - ][j - ] / a[i]);
dpmax[i][j] = max(dpmax[i][j], dpmin[i - ][j - ] / a[i]);
dpmin[i][j] = min(dpmin[i][j], dpmax[i - ][j - ] / a[i]);
dpmin[i][j] = min(dpmin[i][j], dpmin[i - ][j - ] / a[i]);
}
}
}
printf("%lld\n", dpmax[n][m]);
}
return ;
}
焦作网络赛B-Mathematical Curse【dp】的更多相关文章
- ACM-ICPC 2018 焦作赛区网络预赛 B Mathematical Curse(DP)
https://nanti.jisuanke.com/t/31711 题意 m个符号必须按顺序全用,n个房间需顺序选择,有个初始值,问最后得到的值最大是多少. 分析 如果要求出最大解,维护最大值是不能 ...
- 焦作网络赛K-Transport Ship【dp】
There are NN different kinds of transport ships on the port. The i^{th}ith kind of ship can carry th ...
- ACM-ICPC2018焦作网络赛 Mathematical Curse(dp)
Mathematical Curse 22.25% 1000ms 65536K A prince of the Science Continent was imprisoned in a cast ...
- 2018 ICPC 焦作网络赛 E.Jiu Yuan Wants to Eat
题意:四个操作,区间加,区间每个数乘,区间的数变成 2^64-1-x,求区间和. 题解:2^64-1-x=(2^64-1)-x 因为模数为2^64,-x%2^64=-1*x%2^64 由负数取模的性质 ...
- 2018焦作网络赛Mathematical Curse
题意:开始有个数k,有个数组和几个运算符.遍历数组的过程中花费一个运算符和数组当前元素运算.运算符必须按顺序花费,并且最后要花费完.问得到最大结果. 用maxv[x][y]记录到第x个元素,用完了第y ...
- ACM-ICPC2018焦作网络赛 Transport Ship(二进制背包+方案数)
Transport Ship 25.78% 1000ms 65536K There are NN different kinds of transport ships on the port. T ...
- 焦作网络赛E-JiuYuanWantstoEat【树链剖分】【线段树】
You ye Jiu yuan is the daughter of the Great GOD Emancipator. And when she becomes an adult, she wil ...
- 焦作网络赛L-Poor God Water【矩阵快速幂】
God Water likes to eat meat, fish and chocolate very much, but unfortunately, the doctor tells him t ...
- ACM-ICPC2018焦作网络赛 Participate in E-sports(大数开方)
Participate in E-sports 11.44% 1000ms 65536K Jessie and Justin want to participate in e-sports. E- ...
随机推荐
- Eclipse/MyEclipse全屏插件
此插件可以让Eclipse/MyEclipse的界面全屏,隐藏菜单栏和状态栏! MyEclipse 2014/2015中亲测有效! 插件下载: http://files.cnblogs.com/got ...
- 学习:List的扁平化 和 拼接
一.list_to_binary/1的参数:iolist类型的. 二.lists:concat(Things) -> string() Types: Things = [Thing] Thing ...
- erlang的Socket的积压的消息的数量
转自:http://blog.csdn.net/pkutao/article/details/8572216 {ok, Listen} = gen_tcp:listen(?defPort, [bina ...
- 基于bootstrap的Dialog
function yms_Dialog(container_id, modal_path, handle_function) { /// <summary> /// ...
- hadoop本地测试命令
http://www.cnblogs.com/shishanyuan/p/4190403.html if have assign the /etc/profile: hadoop jar /usr/l ...
- VMWare虚拟机提示:打不开磁盘…或它所依赖的某个快照磁盘,开启模块DiskEarly的操作失败,未能启动虚拟机
将电脑上存在的虚拟机复制一份后打开运行,弹出错误提示: 打不开磁盘…或它所依赖的某个快照磁盘,开启模块DiskEarly的操作失败,未能启动虚拟机. 解决方法如下: 打开存放虚拟机系统硬盘的所在文件夹 ...
- kafka原理
今天因为工作接触kafka,先说说kafka是干嘛的. kafka: 说简单点他就是一个基于分布式的消息发布-订阅系统. 然后再理解一些专有名词: Kafka 专用术语 Broker:Kafka 集群 ...
- CentOS6.4环境下布署LVS+keepalived笔记
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://400053.blog.51cto.com/390053/713566 环境: 1 ...
- View的setTag()与getTag()方法使用
通常我们是用findViewById()方法来取得我们要使用的View控件,不过除了这一种方法之处 ,我们还可以用View中的setTag(Onbect)给View添加一个格外的数据,再用getTag ...
- 教程Xcode 下编译发布与提交App到AppStore
The proplem of Prepare for Upload for App store upload Application App store 增加新应用的步骤. 1. 访问iTunesCo ...