牛牛和数组操作

题目链接:nowcoder 224882

题目大意

给你一个没有 0 的数组,每次你可以选一个数,然后把它变成 0,费用是它两边为端点最长的没有 0 的最长区间的最大值。
然后要你在最小化费用和的情况下,求出方案数。

思路

首先我们考虑怎样才会有最大值。

不难发现每次一定要选当前非 0 0 0 区间中最大的(因为你要让最大的贡献次数最少)
(这样子除了一个最大值每个都贡献一次)

然后你就发现你分割开之后两个的顺序两个之间是没有关系的,所以如果两个大小分别是 x , y x,y x,y,那它们后面的组合的方案就是 C x + y x C_{x+y}^x Cx+yx​。

然后你可以拿个记忆化,然后 n 2 n^2 n2 个状态每次转移 n n n 似乎会超时?

没错,但是我们发现一个点可以优化:
如果有最大值连续,那我们就算选的顺序不同,那后面的方案数也是一样的。
所以我们就可以特判,如果出现最大值连续,那我们就直接在这里分了,然后最大值一边一个。

然后这样就变成了 O ( n 2 ) 3 O(\dfrac{n}{2})^3 O(2n​)3。
(因为你可以像之前跑的时候最大值的个数一定不会超过 n 2 \dfrac{n}{2} 2n​)

然后就可以过了。

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#define ll long long
#define mo 998244353using namespace std;ll n, maxn[21][2001];
ll a[2001], log2[2001];
ll rem[2001][2001], C[2001][2001];ll get_max(ll l, ll r) {//ST 表求最大值if (l > r) return 0;ll k = log2[r - l + 1];return max(maxn[k][l], maxn[k][r - (1 << k) + 1]);
}ll work(ll l, ll r) {if (l == r) return 1;if (l > r) return 1;if (rem[l][r] != -1) return rem[l][r];//记忆化ll maxn = get_max(l, r);ll re = 0;for (ll i = l + 1; i <= r; i++) {//处理有连续相同的if (a[i] == maxn && a[i - 1] == maxn) {return work(l, i - 1) * work(i, r) % mo * C[r - l + 1][r - i + 1] % mo;}}for (ll i = l; i <= r; i++)//处理普通的分割if (a[i] == maxn) {re = (re + work(l, i - 1) * work(i + 1, r) % mo * C[r - l][r - i] % mo) % mo;}return rem[l][r] = re;
}int main() {memset(rem, -1, sizeof(rem));scanf("%lld", &n);for (ll i = 1; i <= n; i++) scanf("%lld", &a[i]), maxn[0][i] = a[i];C[0][0] = 1;//预处理组合数for (ll i = 1; i <= n; i++) {C[i][0] = 1;for (ll j = 1; j <= n; j++) {C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mo;}}for (ll i = 1; i <= 20; i++)//ST表预处理for (ll j = 1; j + (1 << i) - 1 <= n; j++)maxn[i][j] = max(maxn[i - 1][j], maxn[i - 1][j + (1 << (i - 1))]);log2[0] = -1;for (ll i = 1; i <= n; i++)log2[i] = log2[i >> 1] + 1;printf("%lld", work(1, n));return 0;
}

【nowcoder 224882】牛牛和数组操作(贪心)(剪枝)(区间DP)相关推荐

  1. 2021牛客NOIP提高组OI赛前模拟赛第一场T2——牛牛和数组操作(区间dp)

    牛牛和数组操作 description solution code description [题目描述] 有n + 2个整数a0, a1, . . . , an, an+1, a0 = an+1 = ...

  2. 牛牛的跳跳棋(贪心)

    题目描述 牛牛最近在玩一种叫做跳跳棋的游戏,棋盘可以看成是一个一维的线性数组,编号从1到n+1. 一开始牛牛的棋子位于第1个格子,游戏的最终目的是将棋子移动到第n+1个格子. 棋盘1~n的每个格子都有 ...

  3. Numpy入门教程:03.数组操作

    背景 什么是 NumPy 呢? NumPy 这个词来源于两个单词 – Numerical和Python.其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: 执 ...

  4. python json数据格式数组内元素递增赋值_python深浅复制,类型转换, json操作,数组操作...

    python深浅复制 import copy a = [1, 2, 3, 4, ['a', 'b']] #原始对象 b = a #赋值,传对象的引用 c = copy.copy(a) #对象拷贝,浅拷 ...

  5. php 常用数组操作

    php常用的数组操作函数,包括数组的赋值.拆分.合并.计算.添加.删除.查询.判断.排序等 array_combine 功能:用一个数组的值作为新数组的键名,另一个数组的值作为新数组的值 <?p ...

  6. php数组操作之合并相同键名的值,排序,排重,去空值等

    一.前言 数组操作是咱们在编程时候经常遇到的,只是数组函数有点多,用到的时候难免会想不起来.特别是针对多维数组的操作,有的时候用自带的数组函数真的很方便,可以避免多次的foreach循环,这里记录一下 ...

  7. C#字符串及数组操作

    一.一维: int[] numbers = new int[]{1,2,3,4,5,6}; //不定长 int[] numbers = new int[3]{1,2,3};//定长 二.多维 int[ ...

  8. 【C 语言】数组 ( 多维数组操作模型 | 取某个数组元素地址 | 取某个数组元素值 )

    文章目录 一.多维数组操作模型 1.取出某个数组元素地址 2.取出某个数组元素值 总结 一.多维数组操作模型 以 // 声明一个多维数组int array[2][3]; 二维数组为例 ; 1.取出某个 ...

  9. PHP内核探索之变量(4)- 数组操作

    原文:PHP内核探索之变量(4)- 数组操作 上一节(PHP内核探索之变量(3)- hash table),我们已经知道,数组在PHP的底层实际上是HashTable(链接法解决冲突),本文将对最常用 ...

最新文章

  1. Camelot:从pdf中提取表格数据
  2. 操作系统第二章 进程管理
  3. oracle建表后添加数据报错:ORA-01658:无法为表空间中的段创建INITIAL区
  4. c#使用PdfiumViewer展示、打印pdf文档
  5. Java临时缓存API –测试早期草案评审RI
  6. 天了噜,我国4G用户超过2亿了!
  7. Windows API 进程状态信息函数
  8. likely() 和 unlikely()内建宏定义函数
  9. php 开发环境配置,开发环境配置
  10. 【转】解决win7下重装winXP 系统启动选择菜单消失 问题
  11. php mysql网页象棋源码_C# 中国象棋 游戏源码
  12. 中国移动的新自由主义精神
  13. HDU 2000 Java 奇怪的jio
  14. 4 WCF中的RPC和OneWay
  15. CF1463-C. Busy Robot
  16. python用for循环求和1到100_python使用for循环计算0-100的整数的和方法
  17. oracle 4043,oracle desc dba_data_files视图报ORA-4043错误小记
  18. 数学上的一些小技巧韩信点兵的问题
  19. Java super关键字详解
  20. 什么是BPM工具?BPM工具有哪些功能?白码详解

热门文章

  1. SIGMOD论文阅读笔记
  2. MySQL高级(一)
  3. hangfire mysql_Hangfire 在.NET Core环境的使用
  4. MySQL 的主从复制原理详解高级
  5. ZKT门禁机标准联接线(按键开关不经过卡机)
  6. 关于元素定位使用class_name定位报错的部分问题Unable to locate element: {“method“:“css selector“
  7. 51单片机LCD显示温度与串口接受温度
  8. 花998购买的拍摄技巧和7天起号培训文档,学了一周的总结。
  9. 字符识别引擎Calamari总结
  10. dms虚拟服务器,iOS UPNP之DMS具体操作,让手机成为DMS服务器