hdu6049
hdu6049
题意
给出一串由 \([1, n]\) 组成的 \(n\) 个数,每个数字都不相同。现在要尽可能的分成多个块,每个块内的数可以任意排序,且分完块后可以交换两个块的位置,问使得最后序列有序可以最多分成几个块。
分析
首先暴力预处理出 \(f[i][j]\) 表示区间 \([i, j]\) 最多可以分成多少块(只有某一段区间的所有数字重排后连续才能当做一块,这个可以通过预处理出区间最大值、最小值去判断,而要想形成多个块,必须保证最小值不能改变,一定是第一个块的最小值)。( \(O(n^2)\) )
然后枚举 \([i, j]\) 也就是我们要交换的第一个块,判断合法性以及后面是否存在一个可以交换的块。( \(O(n^3)\) 其实几乎是 \(O(n^2)\) ,很多都是无效状态 )
code
#include<bits/stdc++.h>
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;
}
hdu6049的更多相关文章
随机推荐
- DataBase -- Operator
TOP子句用于规定要返回的记录的数目. SELECT TOP number | percent column_name FROM table_name LIKE操作符用于在WHERE子句中搜索列的指定 ...
- python实现关联规则
代码中Ci表示候选频繁i项集,Li表示符合条件的频繁i项集 # coding=utf-8 def createC1(dataSet): # 构建所有1项候选项集的集合 C1 = [] for tran ...
- VB托盘图标不响应WM_MOUSEMOVE的原因及解决方法
文章参考地址:http://blog.csdn.net/txh0001/article/details/38265895:http://bbs.csdn.net/topics/330106030 网上 ...
- NOI2018 D1T1 [NOI2018]归程 解题报告
P4768 [NOI2018]归程 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 \(n\) 个节点.\(m\) 条边的无向连通图(节点的编号从 \ ...
- 【BZOJ 2756】[SCOI2012]奇怪的游戏 二分+最大流
这道题提醒我,要有将棋盘黑白染色的意识,尤其是看到相邻格子这样的条件的时候,然后就是要用到与其有关的性质与特点以体现其作用,这道题就是用到了黑格子与白格子之间的关系进行的,其出发点是每次一定会给一个黑 ...
- 十个迅速提升JQuery性能的技巧
本文提供即刻提升你的脚本性能的十个步骤.不用担心,这并不是什么高深的技巧.人人皆可运用!这些技巧包括: 使用最新版本 合并.最小化脚本 用for替代each 用ID替代class选择器 给选择器指定前 ...
- python 闭包与装饰器
1.闭包--返回子函数名 作用:使用子函数之外的父函数的变量 闭包就是你调用了一个函数a,这个函数a反悔了一个子函数名b,这个返回的函数b就叫做闭包 代码举例 def a(): test = 'aa' ...
- 【转载】深入理解PHP Opcode缓存原理
转载地址:深入理解PHP Opcode缓存原理 什么是opcode缓存? 当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码(Operate Code,opcode).O ...
- springmvc4+hibernate4+activiti5.18(Maven)
项目下载地址: http://files.cnblogs.com/files/walk-the-Line/springmvc_activiti5.18_hibernate4.zip
- React module methods with passing props to child or invoking callback to parent.
Some code samples for this pupose: import React from "react"; import MyDemo from "./m ...