题目链接

Problem Description
Sdjpx is a powful man,he controls a big country.There are n soldiers numbered 1~n(1<=n<=3000).But there is a big problem for him.He wants soldiers sorted in increasing order.He find a way to sort,but there three rules to obey.
1.He can divides soldiers into K disjoint non-empty subarrays.
2.He can sort a subarray many times untill a subarray is sorted in increasing order.
3.He can choose just two subarrays and change thier positions between themselves.
Consider A = [1 5 4 3 2] and P = 2. A possible soldiers into K = 4 disjoint subarrays is:A1 = [1],A2 = [5],A3 = [4],A4 = [3 2],After Sorting Each Subarray:A1 = [1],A2 = [5],A3 = [4],A4 = [2 3],After swapping A4 and A2:A1 = [1],A2 = [2 3],A3 = [4],A4 = [5].
But he wants to know for a fixed permutation ,what is the the maximum number of K?
Notice: every soldier has a distinct number from 1~n.There are no more than 10 cases in the input.
 
Input
First line is the number of cases.
For every case:
Next line is n.
Next line is the number for the n soildiers.
 
Output
the maximum number of K.
Every case a line.
 
Sample Input
2
5
1 5 4 3 2
5
4 5 1 2 3
 
Sample Output
4
2
 
 
题意:输入一个1~n的排列,现在要求通过以下三种动作将之变成一个单调上升的序列,三种动作如下:
          1、将这个序列分成K段
          2、可以将任意一个段中的数进行排序,使之变成上升的序列(可以对多个段进行操作)
     3、可以对其中的两个段交换位置,只能交换一次
          求最大的K值?
 
思路:定义f[i][j]表示 i 到 j 之间的区间能分成多少个合法的段(合法的段表示这个区间中的数排序后是一个连续的数列,f[i][j]表示段内排好序后,段与段之间也是保持连续的如段312 和 465 ,123456连续), 通过区间DP可以求出所有 f[i][j],还需要求出每个区间的最大值最小值 mx[][] , mn[][] , 之后枚举所有的子区间。
         对于其中每一个子区间[i,j] , 如果f[i][j]>0,那么就表示i到j排完序后是连续的,否则直接枚举计算下一个区间。当 f[i][j]>0,k=mx[i][j] , 那么区间[i,j]应该和[t,k]区间进行交换位置,t目前还不确定,所以需要枚举t (j<t<=k), 那么必须有: f[1][i-1] >0&&mn[1][i-1]=1 或者i==1  ,mn[t][k]=i,f[k+1][n]>0 && mx[k+1][n]=n 或者 k==n ,ans=max(ans,f[1][i-1]+1+f[j+1][t-1]+1+f[k+1][n]) 。

代码如下:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=3e3+;
int f[N][N];
int mx[N][N],mn[N][N],R[N]; int main()
{
///cout << "Hello world!" << endl;
int T; cin>>T;
while(T--)
{
int n; scanf("%d",&n);
memset(f,,sizeof(f));
for(int i=;i<=n;i++)
{
scanf("%d",&mx[i][i]);
mn[i][i]=mx[i][i];
f[i][i]=;
R[i]=i;
}
for(int i=;i<=n;i++)
{
for(int j=i+;j<=n;j++)
{
mx[i][j]=max(mx[i][j-],mx[j][j]);
mn[i][j]=min(mn[i][j-],mn[j][j]);
}
}
for(int i=;i<=n;i++)
{
for(int j=;j+i-<=n;j++)
{
int k=j+i-;
if(mx[j][k]-mn[j][k]+!=i) f[j][k]=;
else {
if(mn[j][k]!=mn[j][R[j]]) f[j][k]=;
else f[j][k]=f[j][R[j]]+f[R[j]+][k];
R[j]=k;
}
}
}
int ans=f[][n];
for(int i=;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
if(!f[i][j]) continue;
if(i== || (f[][i-]&&mn[][i-]==))
{
int k=mx[i][j];
if(k==n || (f[k+][n]&&mx[k+][n]==n))
{
for(int t=j+;t<=k;t++)
{
if(f[t][k]&&mn[t][k]==i)
ans=max(ans,f[][i-]++f[j+][t-]++f[k+][n]);
}
}
}
}
}
printf("%d\n",ans);
}
return ;
}
          

hdu 6049---Sdjpx Is Happy(区间DP+枚举)的更多相关文章

  1. HDU 6049 - Sdjpx Is Happy | 2017 Multi-University Training Contest 2

    思路来源于 FXXL - - 一个比较奇怪的地方就是第三步可以不做,也就是ans至少为1,听说场内有提问的,然后 admin 说可以不做- - (wa的我心烦) /* HDU 6049 - Sdjpx ...

  2. hdu 4597 + uva 10891(一类区间dp)

    题目链接:http://vjudge.net/problem/viewProblem.action?id=19461 思路:一类经典的博弈类区间dp,我们令dp[l][r]表示玩家A从区间[l, r] ...

  3. HDU 2476 String painter (区间DP)

    题意:给出两个串a和b,一次只能将一个区间刷一次,问最少几次能让a=b 思路:首先考虑最坏的情况,就是先将一个空白字符串刷成b需要的次数,直接区间DP[i][j]表示i到j的最小次数. 再考虑把a变成 ...

  4. HDU 4597 Play Game(区间DP(记忆化搜索))

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4597 题目大意: 有两行卡片,每个卡片都有各自的权值. 两个人轮流取卡片,每次只能从任一行的左端或右端 ...

  5. HDU 5115 Dire Wolf ——(区间DP)

    比赛的时候以为很难,其实就是一个区间DP= =..思路见:点我. 区间DP一定要记住先枚举区间长度啊= =~!因为区间dp都是由短的区间更新长的区间的,所以先把短的区间更新完.. 代码如下: #inc ...

  6. HDU 5151 Sit sit sit 区间DP + 排列组合

    Sit sit sit 问题描述 在一个XX大学中有NN张椅子排成一排,椅子上都没有人,每张椅子都有颜色,分别为蓝色或者红色. 接下来依次来了NN个学生,标号依次为1,2,3,...,N. 对于每个学 ...

  7. hdu 5115 Dire Wolf(区间dp)

    Problem Description Dire wolves, also known as Dark wolves, are extraordinarily large and powerful w ...

  8. HDU 2476 String painter(区间DP)

    String painter Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...

  9. HDU 4745 Two Rabbits(区间DP,最长非连续回文子串)

    Two Rabbits Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total ...

随机推荐

  1. VueJs相关学习网址

      麦子学院 http://www.maiziedu.com/course/916/   慕课网-vue.js入门基础 https://www.imooc.com/learn/694   查阅的网址 ...

  2. IBGP规划

    在IBGP邻居中,使用反射器减少IBGP邻居关系是一种最常用的网络结构,在上图中AS65001中有6台路由器,其中,R1和R2是一组反射器,配置如下: R1: ! interface Loopback ...

  3. [SpringBoot]Web综合开发-笔记

    Web开发 Json接口开发 @RestController 给类添加 @RestController 即可,默认类中的方法都会以 json 的格式返回. 自定义filter filter作用: 用于 ...

  4. Java 接口多继承

    按照理解,一般都是说Java 类是单继承,但可以实现多个接口.但是可以通过接口来实现类的多继承.(如何通过接口来实现多继承???) 那么就一直以为Java里面是单继承,今天看FutureTask源码的 ...

  5. ubuntu系统安装微信小程序开发工具

    在ubuntu系统中安装微信小程序开发工具之前,先要安装wine与git 一.安装wine 1.如果您的系统是64位,启用32位架构(如果您还没有) sudo dpkg --add-architect ...

  6. Linux学习笔记:Tomcat安装与使用

    Tomcat是一个Servlet容器服务器,用java实现的. 目录结构 Tomcat的安装也很简单,从官网下载安装包.解压后的tomcat目录 apache-tomcat-7.0.92 下的子目录为 ...

  7. xbee无线通讯终端

    无线数传电台支持DIGI全系列无线数传模块,包括有xbee/xbee PRO S1.xbee/xbee PRO S2C.xbee WIFI.xbee PRO S3B.xbee/xbee PRO SX( ...

  8. 《Linux就该这么学》第六天课程

    每个人都有梦想,同时也有理想,当一个人的梦想与理想相同时会发生什么? 搜集了一些对新手有用的表格 原创地址:https://www.linuxprobe.com/chapter-05.html use ...

  9. 【repost】jQuery笔记总结

    第一节 jQuery初步认知 jQuery概述 JQuery概念 javascript概念 基于Js语言的API和语法组织逻辑,通过内置window和document对象,来操作内存中的DOM元素 J ...

  10. Vuejs——(13)组件——杂项

    版权声明:出处http://blog.csdn.net/qq20004604   目录(?)[+]   本篇资料来于官方文档: http://cn.vuejs.org/guide/components ...