博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu6049
阅读量:6158 次
发布时间:2019-06-21

本文共 2078 字,大约阅读时间需要 6 分钟。

题意

给出一串由 \([1, n]\) 组成的 \(n\) 个数,每个数字都不相同。现在要尽可能的分成多个块,每个块内的数可以任意排序,且分完块后可以交换两个块的位置,问使得最后序列有序可以最多分成几个块。

分析

首先暴力预处理出 \(f[i][j]\) 表示区间 \([i, j]\) 最多可以分成多少块(只有某一段区间的所有数字重排后连续才能当做一块,这个可以通过预处理出区间最大值、最小值去判断,而要想形成多个块,必须保证最小值不能改变,一定是第一个块的最小值)。( \(O(n^2)\)

然后枚举 \([i, j]\) 也就是我们要交换的第一个块,判断合法性以及后面是否存在一个可以交换的块。( \(O(n^3)\) 其实几乎是 \(O(n^2)\) ,很多都是无效状态 )

code

#include
typedef long long ll;using namespace std;const int MAXN = 3e3 + 10;int n;int mx[MAXN][MAXN], mn[MAXN][MAXN];int a[MAXN], f[MAXN][MAXN]; // f[i][j] : [i, j] 最多能分成多少块void init() { for(int i = 1; i <= n; i++) { mx[i][i] = mn[i][i] = a[i]; for(int j = i + 1; j <= n; j++) { mx[i][j] = max(mx[i][j - 1], a[j]); mn[i][j] = min(mn[i][j - 1], a[j]); } } for(int i = 1; i <= n; i++) { int cnt = 1; f[i][i] = 1; for(int j = i + 1; j <= n; j++) { if(mn[i][j - 1] != mn[i][j]) cnt = 0; if(j - i == mx[i][j] - mn[i][j]) f[i][j] = ++cnt; } }}int main() { int T; scanf("%d", &T); while(T--) { memset(f, 0, sizeof f); scanf("%d", &n); for(int i = 1; i <= n; i++) { scanf("%d", &a[i]); } init(); int ans = f[1][n]; for(int i = 1; i <= n; i++) { // 枚举要交换的左端 [i, j],判断合法并寻找交换的右端 for(int j = i; j <= n; j++) { if(f[i][j]) { if(i == 1 || (mn[1][i - 1] == 1 && mx[1][i - 1] - mn[1][i - 1] == i - 2)) { int x = mx[i][j]; if(x == n || (mx[x + 1][n] == n && mx[x + 1][n] - mn[x + 1][n] == n - x - 1)) { for(int k = x; k > j; k--) { if(f[k][x] && mn[k][x] == i) { ans = max(ans, f[1][i - 1] + 1 + f[j + 1][k - 1] + 1 + f[x + 1][n]); } } } } } } } printf("%d\n", ans); } return 0;}

转载于:https://www.cnblogs.com/ftae/p/7260522.html

你可能感兴趣的文章
linux CentOS7 磁盘分区fdisk 、df 、du、parted 命令实例
查看>>
CUDA学习(六十三)
查看>>
与登录shell相关的文件
查看>>
Git 初次学习笔记
查看>>
Java线程:线程交互
查看>>
dbms_metadata.get_ddl的使用总结
查看>>
修改SSO管理员密码
查看>>
QCwindows server 2003部署
查看>>
批量修改密码脚本
查看>>
关于盘符里某些文件夹删除不了的解决方案研究
查看>>
lzg_ad:XPE操作系统镜像尺寸优化
查看>>
GlusterFS架构与维护
查看>>
全天下最经典的句子,2013重现!
查看>>
Microsoft Windows 7.0 build 7000 NAP测试--健康状态检测验证报告
查看>>
容器间通信的三种方式 - 每天5分钟玩转 Docker 容器技术(35)
查看>>
Linux权限管理总结(1)--基础权限
查看>>
sql server常用函数
查看>>
64位Outlook 无法与OC集成
查看>>
Unity3d切水果,坦克,投篮游戏视频
查看>>
Linux命令TOP TEN
查看>>