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的更多相关文章
随机推荐
- MySQL事物机制具备四点:简称ACID操作
MySQL事物机制具备四点:简称ACID操作 1.原子性:要么都做,要么都不做(两条数据(写入和存储)一步未成功,整体回滚) 2.一致性:数据库的状态改变(两条数据(写入和存储)均成功,符合原子性,但 ...
- [Leetcode] combinations 组合
Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For exampl ...
- BZOJ1143 [CTSC2008]祭祀river 【二分图匹配】
1143: [CTSC2008]祭祀river Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3236 Solved: 1651 [Submit] ...
- photo@PKU
- Windows Server 2008 R2 Upgrade Paths
https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/dd ...
- Hadoop之yarn调用机制
1,Mapper方法:如果在map方法之前执行一些程序用setup,之后用cleanup.同理在Reducer方法中也有setup和cleanup. 2,map任务是并行执行,没有谁先谁后,如果是两个 ...
- 【AtCoder】ARC082 F - Sandglass
[链接]F - Sandglass [题意]给定沙漏A和B,分别装着a和X-a的沙子,开始时A在上B在下,每秒漏1,漏完不再漏.给定n,有n个时刻ai沙漏倒转.给定m个询问,每次询问给定初值a和时刻t ...
- #error#学习方法,如何避免初始化错误
#error#学习方法,如何避免初始化错误.错误来自:本博客的另一篇文章Demo示例程序源代码: ,01-导航实例-QQ空间.xcodeproj - CYLLoginViewController.mD ...
- bzoj 2749 杂题
我们可以发现,phi(x)与x相比,相当于x的每个质因子-1后再分解质因数,添加到现有的质因子中,比如质因子13相当于将13变成12,然后分解成2*2*3,再将2的质数+2,3的指数+1,除了质因子2 ...
- linux下rm命令删除文件名中包含特殊字符的文件【转】
转自:http://blog.itpub.net/143526/viewspace-1060083/ 1. 删除带“-”的文件名的方法 2. 删除包含其它特殊字符的文件 3. 删除系统打不出的乱码文件 ...