题目描述:

[HNOI2010]合唱队 - 洛谷https://www.luogu.com.cn/problem/P3205

题目信息提取:

这个题目要求我们按照某种顺序将这个队伍中的所有人按照从左到右的顺序去排队,其实题目中的很多无用信息可以忽略,总结为,寻找某种数列,将这个数列按照从左到右的顺序依次进行排列,排列规则是,如果当前数字大于前一个已经排列完的数,那么他就放在新的当前排列的数列的最后面,如果他小于前一个已经排列玩的数字,那么他就放在当前排列的数列的最前面,看下面一个例子:

例如 初始数列为 33 22 11 44 那么他的排列顺序就是

因为22<33 所以 22 33

因为11<22 所以 11 22 33

因为44>11 所以 11 22 33 44

题目思路归纳:

我们了解了基本的规则以后,看题目,题目给出一个期望得到的排列后的数列,让我们求出有几种默认的数列排放顺序可以经过排序后得到期望数列。所以我们可以考虑假如 我们要求的 期望数列为 11 22 33 44既然是动态规划,我们将应该先去总结出有无状态之间的转换关系,即状态转移方程,11 22 33 44的初始队列数量如何从一个子结构转化出来,11 22 33 44 他既可能是 22 33 44 加入了11也可能是11 22 33 加入了44,只有这两种可能,因为最新加入的数字一定在队列的最左侧或者是最右侧这句话是重点所以标红,所以我们知道了状态转移的规则,即当前状态一定是从他的左侧不包含最左侧数字的最优子结果和右侧不包含右侧数字的最优子结果转化而来的,这句话的理解非常重要,但是他是如何转化的呢?

还是看11 22 33 44 这个例子假如 11 22 33 44 是从11 22 33转化来的,那么数列最右侧的数字一定大于他的前一个数字,否则不成立,即不可能转化,那么他的前一个数字会在哪呢,其实同理就知道,他的前一个数字肯定就是11,33其中的某一个,这两种情况都可能如果是11先排序然后44排序,可以看到情况符合条件是成立的,例如是33排序后44排序,情况也是成立的,所以这两种情况都可以排列出我们要求的顺序,所以这两种情况相加就是44从右侧加进来的情况的数量,那么还有一种情况就是从22 33 44转化来的,即11是最后排序的,那么我们再来讨论11,11也有两种情况,即22和44都有可能是在11之前加入的,假如11小于22,那么22是最后加入的情况也是成立的,假如11小于 44,那么11最后加入的情况也是成立的,我们可以看到当前的数列也是满足这个要求的,所以同理11最后加入的情况的数量就等于22加入的数量加上44加入的数量之和,我们讨论完了这两种情况,不存在其他的情况了,所以11 22 33 44 的所有初始队列种类就是两者之和:我们有了思路就可以总结转台转移方程了,

这里我们使用两个数组来表示left[i][j]表示在下标i-j的这个数列中,最后加入的是i的种类数目而right[i][j]反之.

状态转移方程:

left[i][j] += left[i+1][j] when num[i] < num[i+1] eg:num是期望数列

left[i][j] += right[i+1][j] when num[i]<num[j]

right[i][j] += right[i][j-1] when num[j]>num[j-1]

right[i][j] += left[i][j-1] when num[j]>num[i]

代码书写:

我们知道了状态转移方程也就基本知道了代码结构了,但是还有一些细节需要注意,例如状态的初态和循环测顺序,首先我门看循环顺序,我们要确定循环的顺序首先看状态转移方程中状态之间的关系,在第一个和第二个状态转移方程中我们都需要i+1时的状态,所以我们可以确定i需要逆序递减求值,在2,3中可以看到都需要j-1的状态所以可以确定j需要递增,所以我们可以确定i的循环要从n开始逐渐递减,j要从i+1开始逐渐递增,来不断的扩展子状态的范围,然后我们需要确认初态,我们要给left[i][j]或者是right[i][j]其中的任何一个赋值1以确保任意值不会为0,只能赋值其中一个,因为当只有一个数时,它只能是从左边进或者是右边进,互相矛盾,所以最终的代码为:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class Main {public static void main(String[] args) throws IOException {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));int n = Integer.parseInt(reader.readLine());String[] intStr = reader.readLine().split(" ");int[] ans = new int[n];for(int i = 0;i<n;i++){ans[i] = Integer.parseInt(intStr[i]);}int[][] left = new int[n][n];int[][] right = new int[n][n];for(int i = 0;i<n;i++){left[i][i] = 1;}for(int i = n-1;i>=0;i--){for(int j = i+1;j<n;j++){if(ans[i]<ans[j])left[i][j] +=right[i+1][j];if(ans[i]<ans[i+1])left[i][j] +=left[i+1][j];if(ans[j]>ans[j-1]){right[i][j]+=right[i][j-1];}if(ans[j]>ans[i])right[i][j] +=left[i][j-1];right[i][j]%=19650827;left[i][j]%=19650827;}}System.out.println((left[0][n-1]+right[0][n-1])%19650827);}}

【Java题解】洛谷题目P3205合唱队-区间动态规划解法相关推荐

  1. Codeforces与洛谷题目之间跳转油猴插件

    title: Codeforces与洛谷题目之间跳转油猴插件 date: 2023-05-04 15:32:39 categories: 其他 tags: 油猴脚本 Codeforces与洛谷题目之间 ...

  2. 题解 洛谷P1365 WJMZBMR打osu! / Easy

    题解 洛谷P1365 WJMZBMR打osu! / Easy Date 2019.7.28 题目大意 给出一个长度为n的由o,x,?组成的字符串,对于每连续的a个o,就有a2分.同时,对于任意的?,有 ...

  3. 中秋特辑--洛谷题目-P2431【正妹吃月饼】

    中秋特辑-洛谷题目讲解 P2431 正妹吃月饼 又快到了一年一次的中秋节了,也不知道大家有没有去吃月饼,嘿嘿,我最喜欢云腿月饼老好吃了. 虽然是到了中秋节,但是我们依然要刷题来复习和提高自己欸. 现在 ...

  4. 洛谷题目按难度点评---入门难度

    洛谷题目按难度点评---入门难度 1.p1421 小玉买文具 难度:入门难度 考点:输入,输出,整数的四则运算 适用:小学生 #include <stdio.h> int main(){ ...

  5. 洛谷P1133 教主的花园 动态规划

    洛谷P1133 教主的花园 动态规划 这里是环状的,但是我们并不用将他破环成链 只要枚举第一个点 根据第一个点选择最后一个选择什么就行了 然后我们进行DP 注意如果当前是 2 的话要分情况 上一次是上 ...

  6. 洛谷1594 护卫队_区间dp_题解

    护卫队 出自洛谷题库 https://www.luogu.com.cn/problem/P1594 [问题描述] 不是具体题目 大概就是有n个车要过河,只有一个桥(理论上只能单向通行,其实不用管对面) ...

  7. 洛谷 P1440 求m区间内的最小值

    题目描述 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值.若前面的数不足m项则从第1个数开始,若前面没有数则输出0. 输入输出格式 输入格式: 第一行两个 ...

  8. Java实现洛谷 P1428 小鱼比可爱

    题目描述 人比人,气死人:鱼比鱼,难死鱼.小鱼最近参加了一个"比可爱"比赛,比的是每只鱼的可爱程度.参赛的鱼被从左到右排成一排,头都朝向左边,然后每只鱼会得到一个整数数值,表示这只 ...

  9. python刷题 NOI题库 python题解 洛谷、牛客网、AcWing 刷题等

    NOI题库 python题解-2022.01.07整理(1.1-1.3) NOI题库 python题解-2022.01.07整理(1.1-1.3)_dllglvzhenfeng的博客-CSDN博客 N ...

最新文章

  1. PyTorch 1.8来了!正式支持AMD GPU,炼丹不必NVIDIA
  2. Java虚拟机(JVM)面试题大集合
  3. Win11系统调节屏幕亮度的方法
  4. 容器编排技术 -- Kubernetes 为 Namespace 配置Pod配额
  5. 【日期类问题】例2.2 Day of week
  6. 开源媒体标注系统cvat
  7. elementUI 日期选择控件少一天的问题解决方法
  8. PTA: 6-5 删除单链表偶数节点 (20 分)
  9. mysql之5.7开放远程访问权限
  10. iOS之性能优化·内置图片瘦身
  11. F - Ingenuous Cubrency ( UVa 11137 ,立方数之和,递推关系,算法进阶手册)
  12. 软件测试缺陷报告总结
  13. STM32F407 SPI线的选择
  14. eig()函数求特征值、特征向量、归一化
  15. LOGO 8.3 Web Server功能
  16. 数独游戏开发——计时器实现
  17. 高通和LG携手于2018年开始测试5G车辆互联网;Google 宣布攻破 SHA-1 加密│IoT黑板报...
  18. OA系统以项目管理为中心,为会计事务所打造内外协同一体化平台
  19. 二十一世纪大学英语读写教程(第三册)学习笔记(原文)——1 - How I Got Smart(我是如何变聪明的)
  20. SONY VAIO P VPCP118KJ索尼酷袋本 鸡肋上网本初体验

热门文章

  1. citespace的操作流程
  2. python处理数据的一些代码
  3. 安装mysql odbc重启mssql_关于php连接mssql:pdo odbc sql server
  4. matlab 函数 未定义,matlab一直说我未定义函数或变量x怎么办?
  5. 高质量App的架构设计与思考!
  6. java声明一个父类A,java 子类强转父类 父类强转子类
  7. 传感器实验——噪音警报
  8. 如何用微信管理员工、管理团队
  9. c语言编程中负1什么意思,c语言中1e是什么意思?
  10. 用命令强行杀一些顽固不化的病毒进程