题目描述
为了在即将到来的晚会上有更好的演出效果,作为 A 合唱队负责人的小 A 需要将合唱队的人根据他们的身高排出一个队形。假定合唱队一共 n 个人,第 i 个人的身高为 hi),并已知任何两个人的身高都不同。假定最终排出的队形是 A 个人站成一排,为了简化问题,小 A 想出了如下排队的方式:他让所有的人先按任意顺序站成一个初始队形,然后从左到右按以下原则依次将每个人插入最终棑排出的队形中:

第一个人直接插入空的当前队形中。

对从第二个人开始的每个人,如果他比前面那个人高(h 较大),那么将他插入当前队形的最右边。如果他比前面那个人矮(h 较小),那么将他插入当前队形的最左边。

当 n 个人全部插入当前队形后便获得最终排出的队形。

例如,有 6 个人站成一个初始队形,身高依次为 1850, 1900, 1700, 1650, 1800, 1750,
那么小 A 会按以下步骤获得最终排出的队形:

1850。

1850, 1900,因为 1900 > 1850。

1700, 1850, 1900,因为 1700 < 1900。

1650, 1700, 1850, 1900,因为 1650 < 1700。

1650, 1700, 1850, 1900, 1800,因为 1800 > 1650。

1750, 1650, 1700, 1850, 1900, 1800,因为 1750 < 1800。

因此,最终排出的队形是 1750, 1650, 1700, 1850, 1900, 1800。

小 A 心中有一个理想队形,他想知道多少种初始队形可以获得理想的队形。

请求出答案对 19650827 取模的值。

输入格式
第一行一个整数 n。
第二行 n 个整数,表示小 A 心中的理想队形。

输出格式
输出一行一个整数,表示答案 mod19650827 的值。

输入输出样例
输入
4
1701 1702 1703 1704
输出
8
说明/提示
对于 30% 的数据,n<=100
对于 100% 的数据,n<=1000,hi<=2000

思路:
(一)状态转移

dp[i][j][0]表示第i个人从左边来的方案数;
dp[i][j][1]表示第j个人从右边来的方案数;

先讨论第一种:
第i个人从左边来,他既然从左边来,要么第i+1人从左边来且h[i+1]>h[i];要么第j个人从右边来且h[j]>h[i];

所以有如下状态转移动:

if(h[i+1]>h[i])dp[i][j][0]+=dp[i+1][j][0];
if(h[j]>h[i])dp[i][j][0]+=dp[i+1][j][1];

第二种情况一次类推;

(二)初始化
当然,我们初始化时要注意

dp[i][i][0]=1;
dp[i][i][1]=0;

为什么要这样定义呢?因为只有一个人的时候不管从左来还是从右来只有一种方案,所以我们默认,只有1人时从左来(要不然会多数!)

code(记忆化搜索形式):

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
int h[1001];
ll dp[1001][1001][2];
const int mod=19650827;void init(){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(i==j){dp[i][j][0]=1;dp[i][j][1]=0;}else{dp[i][j][0]=-1;dp[i][j][1]=-1;}}}
}ll dfs(int i,int j,int k){if(dp[i][j][k]!=-1)return dp[i][j][k];else if(j<i)return dp[i][j][k]=0;else{ll ans=0;if(k==0){if(h[i]<h[i+1]){ans=(ans+dfs(i+1,j,0))%mod;}if(h[i]<h[j]){ans=(ans+dfs(i+1,j,1))%mod;}}else{if(h[j]>h[i]){ans=(ans+dfs(i,j-1,0))%mod;}if(h[j]>h[j-1]){ans=(ans+dfs(i,j-1,1))%mod;}}return dp[i][j][k]=ans;}
}int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",h+i);}init();ll ans=(dfs(1,n,0)+dfs(1,n,1))%mod;printf("%lld\n",ans);return 0;
}

洛谷oj---P3205 [HNOI2010]合唱队相关推荐

  1. 洛谷P3205 [HNOI2010]合唱队 题解

    洛谷P3205 [HNOI2010]合唱队 题解 题目链接:P3205 [HNOI2010]合唱队 题意: 为了在即将到来的晚会上有更好的演出效果,作为 AAA 合唱队负责人的小 A 需要将合唱队的人 ...

  2. 【区间dp】洛谷 P3205 [HNOI2010]合唱队

    P3205 [HNOI2010]合唱队 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意:有一个初始队形,这个初始队形可以是任意队形 给定一个理想队形,问你通过以下的排列方式有几 ...

  3. 洛谷——P3205 [HNOI2010]合唱队

    P3205 [HNOI2010]合唱队 题目描述 为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需要将合唱队的人根据他们的身高排出一个队形.假定合唱队一共N个人,第i个人的身高为 ...

  4. 洛谷 P3205 [HNOI2010]合唱队 解题报告

    P3205 [HNOI2010]合唱队 题目描述 为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需要将合唱队的人根据他们的身高排出一个队形.假定合唱队一共N个人,第i个人的身高为 ...

  5. P3205 [HNOI2010]合唱队

    P3205 [HNOI2010]合唱队 题意: 有n个数,然后插入队伍中,如果队列当前为空,则直接插入,然后每次插入和上一次插入的比较,如果大于,插入当前队列的最右侧,如果小于,插入当前队列的最左侧 ...

  6. #洛谷oj:P1525 [NOIP2010 提高组] 关押罪犯

    洛谷oj:P1525 [NOIP2010 提高组] 关押罪犯 #题目描述 #一看很明显是贪心算法 加排序 因为 这个中间最大值的那一对肯定是不会在一起的 从大到小来看 所有点对都尽量不要在一个监狱 # ...

  7. 【动态规划dp】区间DP模板 Acwing 282. 石子合并 | P3205 [HNOI2010]合唱队

    区间DP 模板 282. 石子合并 #include<iostream> #include<cmath> #include<algorithm> #include& ...

  8. 洛谷oj题单【入门2】分支结构-入门难度(Java)

    洛谷oj题单[入门2]分支结构-入门难度(Java) 来源:https://www.luogu.com.cn/training/101#problems P5709 [深基2.习6]Apples Pr ...

  9. 洛谷OJ 入门与面试 B2001-B2148 题解

    洛谷OJ 入门与面试 B2001-B2148 链接:https://pan.baidu.com/s/1cMRv6SBjL_sehYj7oM8gkw 提取码:tel3 B2001 入门测试题目 #inc ...

  10. 洛谷 P3205 [HNOI2010]合唱队(区间dp)

     题目链接: [HNOI2010]合唱队 - 洛谷https://www.luogu.com.cn/problem/P3205  思路: 这题我是看了题解才做出来的,贴一下这位大佬的博客题解 P320 ...

最新文章

  1. QIIME 2用户文档. 13训练特征分类器Training feature classifiers(2019.7)
  2. 从源码分析DEARGUI之add_tab 和 add_tab_bar
  3. java web七:http协议
  4. java解析xml实例_在java中使用dom解析xml的示例分析
  5. 数据结构(二)算法基础与复杂度
  6. mysql 监控工具安装_Mysql监控工具Innotop工具安装
  7. 配置 Oracle 11gR2 在 CentOS6 上开机自启动
  8. Struts2拦截器的使用 (详解)
  9. php 音频上传大小限制,WordPress最大上传文件大小限制修改 | Stay Curious
  10. 九九乘法表之循环嵌套的奇妙
  11. 通信专业顶刊_通信类期刊排名_2016通信期刊排名_2016通信前沿新技术
  12. phpStorm和git解决冲突
  13. android root 升级失败怎么办,手机root失败怎么办 安卓手机root失败原因分析
  14. linux虚拟机usb网卡驱动,【Vbox】centos虚拟机安装usb网卡驱动
  15. 出现C:\Users\liu\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\contrib\rnn\pytho
  16. cad修改快捷键_CAD新手攻略:修剪(TRIM)CAD命令快捷键的使用技巧
  17. 基于RTP协议的IP电话QoS监测及提高策略
  18. 一种改进的教与学优化算法
  19. NTP网络时钟同步协议对计算机网络数据的重要性
  20. Java——线程插队_join ()方法来实现“插队功能”

热门文章

  1. 全网最详细的VMware虚拟机下载安装教程
  2. MySQL常用函数之聚合函数
  3. 禁止国外IP连接服务器
  4. Windows -- ThinkPad E470 win10-64bit显示问题和声音播放问题
  5. ETL数据清洗工具总结
  6. 基于vue与element ui的vue-cron插件的使用及将定时任务cron表达式解析成中文
  7. mysql的驱动jar包_各版本MySQL数据库驱动程序jar包大全(java连接mysql驱动jar包)
  8. 工程控制论 理论概况
  9. 【知识点总结】电机学——题目部分
  10. codejock 用法记录