【来源】:2018年焦作网络赛B

【题意】:

  有n个数字,有m个符号运算。通过不回头(即选取m个数有顺序可言),消除巫术的,并达到最大的价值。

  其实意思就是在数组里选取一段子序列,然后进行m次加减乘除的运算。最后使答案最大化。

【思路】:

  考虑DP,我们考虑加减时只需要考虑最大值即可,但是乘除两个运算的加入就会使这个题目变得复杂了。

  然后我们需要的记录最大值和最小值,因为每一个值可能是从最大值转移过来,也有可能最小值转移过来的。

  所以需要同时记录。

【注意】:

  1、记得初始化(多组数据)

  2、如果直接转移会耗费O(n^2),其实我们只是关心前i个里面获取的最大值,所以我们需要压缩,从前一个数字的暂存值进行更新。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N = 1e4+;
  5. const int M = ;
  6. const ll inf = 0x7fffffffffffffff;
  7. ll dp[N][M][]; //0_ 最小值 ,1 最大值
  8. ll a[N];
  9. int main(){
  10. int T;
  11. int n,m,k;
  12. char opt[M] ;
  13. for( scanf("%d",&T) ; T ;T-- ){
  14. scanf("%d%d%d",&n,&m,&k);
  15. for(int i=;i<=n;i++) scanf("%lld",&a[i]);
  16. scanf("%s",opt+);
  17.  
  18. for(int i=;i<=n;i++){
  19. for(int j=;j<=m;j++){
  20. dp[i][j][] = inf ;
  21. dp[i][j][] = -inf ;
  22. }
  23. }
  24.  
  25. for(int i=;i<=n;i++){
  26. dp[i][][] = dp[i][][] = k;
  27. }
  28.  
  29. for(int j=;j<=m;j++){
  30. for(int i=;i<=n;i++){
  31. if( i > j ){
  32. dp[i][j][] = dp[i-][j][];
  33. dp[i][j][] = dp[i-][j][];
  34. }
  35.  
  36. if( opt[j] =='+'){
  37. dp[i][j][] = min( dp[i][j][] , dp[i-][j-][] + a[i] );
  38. dp[i][j][] = min( dp[i][j][] , dp[i-][j-][] + a[i] );
  39.  
  40. dp[i][j][] = max( dp[i][j][] , dp[i-][j-][] + a[i] );
  41. dp[i][j][] = max( dp[i][j][] , dp[i-][j-][] + a[i] );
  42. }else if( opt[j] == '-'){
  43. dp[i][j][] = min( dp[i][j][] , dp[i-][j-][] - a[i] );
  44. dp[i][j][] = min( dp[i][j][] , dp[i-][j-][] - a[i] );
  45.  
  46. dp[i][j][] = max( dp[i][j][] , dp[i-][j-][] - a[i] );
  47. dp[i][j][] = max( dp[i][j][] , dp[i-][j-][] - a[i] );
  48. }else if( opt[j] == '*' ){
  49. dp[i][j][] = min( dp[i][j][] , dp[i-][j-][] * a[i] );
  50. dp[i][j][] = min( dp[i][j][] , dp[i-][j-][] * a[i] );
  51.  
  52. dp[i][j][] = max( dp[i][j][] , dp[i-][j-][] * a[i] );
  53. dp[i][j][] = max( dp[i][j][] , dp[i-][j-][] * a[i] );
  54. }else{
  55. dp[i][j][] = min( dp[i][j][] , dp[i-][j-][] / a[i] );
  56. dp[i][j][] = min( dp[i][j][] , dp[i-][j-][] / a[i] );
  57.  
  58. dp[i][j][] = max( dp[i][j][] , dp[i-][j-][] / a[i] );
  59. dp[i][j][] = max( dp[i][j][] , dp[i-][j-][] / a[i] );
  60. }
  61. }
  62. }
  63.  
  64. printf("%lld\n",dp[n][m][]);
  65. }
  66. return ;
  67. }

【动态规划】Mathematical Curse的更多相关文章

  1. ACM-ICPC2018焦作网络赛 Mathematical Curse(dp)

    Mathematical Curse 22.25% 1000ms 65536K   A prince of the Science Continent was imprisoned in a cast ...

  2. ACM-ICPC 2018 焦作赛区网络预赛 B题 Mathematical Curse

    A prince of the Science Continent was imprisoned in a castle because of his contempt for mathematics ...

  3. ACM-ICPC 2018 焦作赛区网络预赛 B Mathematical Curse(DP)

    https://nanti.jisuanke.com/t/31711 题意 m个符号必须按顺序全用,n个房间需顺序选择,有个初始值,问最后得到的值最大是多少. 分析 如果要求出最大解,维护最大值是不能 ...

  4. 2018焦作网络赛Mathematical Curse

    题意:开始有个数k,有个数组和几个运算符.遍历数组的过程中花费一个运算符和数组当前元素运算.运算符必须按顺序花费,并且最后要花费完.问得到最大结果. 用maxv[x][y]记录到第x个元素,用完了第y ...

  5. 2018 ACM 网络选拔赛 焦作赛区

    A. Magic Mirror #include <cstdio> #include <cstdlib> #include <cmath> #include < ...

  6. ACM-ICPC 2018 焦作赛区网络预赛 Solution

    A. Magic Mirror 水. #include <bits/stdc++.h> using namespace std; int t; ]; inline bool work() ...

  7. ACM-ICPC 2018 焦作赛区网络预赛

    这场打得还是比较爽的,但是队友差一点就再过一题,还是难受啊. 每天都有新的难过 A. Magic Mirror Jessie has a magic mirror. Every morning she ...

  8. [Reinforcement Learning] 动态规划(Planning)

    动态规划 动态规划(Dynamic Programming,简称DP)是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法. 动态规划常常适用于具有如下性质的问题: 具有最优子结构(Opt ...

  9. 焦作网络赛B-Mathematical Curse【dp】

    A prince of the Science Continent was imprisoned in a castle because of his contempt for mathematics ...

随机推荐

  1. Java基础线程系列大纲

    ## Java 多线程之 线程创建 ## Java 多线程之 Sleep ## Java 多线程之 Join ## Java 多线程之 生命周期 ## Java 多线程之 wait, notify a ...

  2. Linux设备驱动程序 之 poll和select

    使用非阻塞IO的应用程序经常使用select,poll,epoll系统调用:它们的功能本质上是一样的:都允许进程决定是否可以对一个或者多个打开的文件做非阻塞的读取或者写入:这些电泳也会阻塞进程,直到给 ...

  3. Nginx-HTTP之框架的初始化

    http 框架的初始化与 nginx-rtmp 框架的初始化类似: Nginx-rtmp之配置项的管理 1. ngx_http_module_t ngx_http_module 核心模块定义了新的模块 ...

  4. 第11组 Alpha冲刺(2/6)

    第11组 Alpha冲刺(2/6)   队名 不知道叫什么团队 组长博客 https://www.cnblogs.com/xxylac/p/11860949.html 作业博客 https://edu ...

  5. Qt 单元测试

      使用Qtcreator 自带的单元测试工具框架QTestlib进行测试. 一.创建一个单元测试程序 new project->other project ->Qt unit test ...

  6. Going Deeper with Convolutions阅读摘要

      论文链接:Going deeper with convolutions 代码下载: Abstract We propose a deep convolutional neural network ...

  7. Myeclipse 启动tomcat项目报Out of memory: java heap space

    问题: 在Myeclipse中启动tomcat,程序启动过程中报内存不足,java.lang.OutOfMemoryError: Java heap space 从错误可以看出是堆内存太小,需要配置j ...

  8. hive常用的字符串操作函数

  9. linux定时脚本:删除linux/HDFS上过期文件

    一.定时删除linux上定时的文件 显示20分钟前的文件 -exec ls -l {} \; 删除20分钟前的文件 -exec rm {} \; 显示20天前的文件 -exec ls -l {} \; ...

  10. react-native-picke Cannot read property '_init' of undefined

    使用react-native-picker报以下错误: 查看了react-native-picke的issues: https://github.com/beefe/react-native-pick ...