题目链接

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. H5滑条(input type=range)

    input[type=range] { -webkit-appearance: none; width: 230px; border-radius: 10px; /*这个属性设置使填充进度条时的图形为 ...

  2. IBGP规划

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

  3. flutter 自己整理

    2018-05 资料 常见问题解决处 https://flutter.io/flutter-for-android/ 起步 api widget https://flutter.io/docs/ 其他 ...

  4. 【python原理解析】python中分片的实现原理及使用技巧

    首先:说明什么是序列? 序列中的每一个元素都会被分配一个序号,即元素的位置,也称为索引:在python中的序列包含:字符串.列表和元组 然后是:什么是分片? 分片就是通过操作索引访问及获得序列的一个或 ...

  5. VMware虚拟机配置端口转发(端口映射),实现远程访问【转】

    前言本文所写的远程为各个电脑在同一个网段内 本文主要详细介绍如何远程访问虚拟机里面的项目! 机器:虚拟机(装在电脑1里).电脑1(宿主机).电脑2.电脑3.电脑4.电脑n... 操作步骤: step1 ...

  6. jq怎么给图片绑定上传文件按钮

    html代码 <img src="/img/zhengmian.png" alt="" class="file1"> <i ...

  7. [leetcode]25. Reverse Nodes in k-Group每k个节点反转一下

    Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. k  ...

  8. charles本地调试之map和rewrite功能

    charles是一款mac下代理调试工具,对于前端开发同学来说是相当方便的一个调试接口的工具:不过charles需要收费,不过在天朝几乎收费的软件都能找到破解方法: 使用charles前,需要将cha ...

  9. WEB框架本质和第一个Django实例

    Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 总的来说:Web框架的本质就是浏览 ...

  10. 20165213周启航java学习总结

    20165213周启航java学习总结 一.每周博客链接及二维码 预备作业一:我所期望的师生关系:http://www.cnblogs.com/rocedu/p/6255835.html#WEEK15 ...