洛谷oj---P3205 [HNOI2010]合唱队
题目描述
为了在即将到来的晚会上有更好的演出效果,作为 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]合唱队相关推荐
- 洛谷P3205 [HNOI2010]合唱队 题解
洛谷P3205 [HNOI2010]合唱队 题解 题目链接:P3205 [HNOI2010]合唱队 题意: 为了在即将到来的晚会上有更好的演出效果,作为 AAA 合唱队负责人的小 A 需要将合唱队的人 ...
- 【区间dp】洛谷 P3205 [HNOI2010]合唱队
P3205 [HNOI2010]合唱队 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意:有一个初始队形,这个初始队形可以是任意队形 给定一个理想队形,问你通过以下的排列方式有几 ...
- 洛谷——P3205 [HNOI2010]合唱队
P3205 [HNOI2010]合唱队 题目描述 为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需要将合唱队的人根据他们的身高排出一个队形.假定合唱队一共N个人,第i个人的身高为 ...
- 洛谷 P3205 [HNOI2010]合唱队 解题报告
P3205 [HNOI2010]合唱队 题目描述 为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需要将合唱队的人根据他们的身高排出一个队形.假定合唱队一共N个人,第i个人的身高为 ...
- P3205 [HNOI2010]合唱队
P3205 [HNOI2010]合唱队 题意: 有n个数,然后插入队伍中,如果队列当前为空,则直接插入,然后每次插入和上一次插入的比较,如果大于,插入当前队列的最右侧,如果小于,插入当前队列的最左侧 ...
- #洛谷oj:P1525 [NOIP2010 提高组] 关押罪犯
洛谷oj:P1525 [NOIP2010 提高组] 关押罪犯 #题目描述 #一看很明显是贪心算法 加排序 因为 这个中间最大值的那一对肯定是不会在一起的 从大到小来看 所有点对都尽量不要在一个监狱 # ...
- 【动态规划dp】区间DP模板 Acwing 282. 石子合并 | P3205 [HNOI2010]合唱队
区间DP 模板 282. 石子合并 #include<iostream> #include<cmath> #include<algorithm> #include& ...
- 洛谷oj题单【入门2】分支结构-入门难度(Java)
洛谷oj题单[入门2]分支结构-入门难度(Java) 来源:https://www.luogu.com.cn/training/101#problems P5709 [深基2.习6]Apples Pr ...
- 洛谷OJ 入门与面试 B2001-B2148 题解
洛谷OJ 入门与面试 B2001-B2148 链接:https://pan.baidu.com/s/1cMRv6SBjL_sehYj7oM8gkw 提取码:tel3 B2001 入门测试题目 #inc ...
- 洛谷 P3205 [HNOI2010]合唱队(区间dp)
题目链接: [HNOI2010]合唱队 - 洛谷https://www.luogu.com.cn/problem/P3205 思路: 这题我是看了题解才做出来的,贴一下这位大佬的博客题解 P320 ...
最新文章
- QIIME 2用户文档. 13训练特征分类器Training feature classifiers(2019.7)
- 从源码分析DEARGUI之add_tab 和 add_tab_bar
- java web七:http协议
- java解析xml实例_在java中使用dom解析xml的示例分析
- 数据结构(二)算法基础与复杂度
- mysql 监控工具安装_Mysql监控工具Innotop工具安装
- 配置 Oracle 11gR2 在 CentOS6 上开机自启动
- Struts2拦截器的使用 (详解)
- php 音频上传大小限制,WordPress最大上传文件大小限制修改 | Stay Curious
- 九九乘法表之循环嵌套的奇妙
- 通信专业顶刊_通信类期刊排名_2016通信期刊排名_2016通信前沿新技术
- phpStorm和git解决冲突
- android root 升级失败怎么办,手机root失败怎么办 安卓手机root失败原因分析
- linux虚拟机usb网卡驱动,【Vbox】centos虚拟机安装usb网卡驱动
- 出现C:\Users\liu\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\contrib\rnn\pytho
- cad修改快捷键_CAD新手攻略:修剪(TRIM)CAD命令快捷键的使用技巧
- 基于RTP协议的IP电话QoS监测及提高策略
- 一种改进的教与学优化算法
- NTP网络时钟同步协议对计算机网络数据的重要性
- Java——线程插队_join ()方法来实现“插队功能”