前言:基本上發題解的都是抄的題解所以

來源:題解


题目描述

为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需要将合唱队的人根据他们的身高排出一个队形。假定合唱队一共N个人,第i个人的身高为Hi米(1000<=Hi<=2000),并已知任何两个人的身高都不同。假定最终排出的队形是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心中有一个理想队形,他想知道多少种初始队形可以获得理想的队形

输入输出格式

输入格式:

输出格式:

注意要mod19650827

输入输出样例

输入样例#1:

4
1701 1702 1703 1704
输出样例#1:

8

说明

30%的数据:n<=100

100%的数据:n<=1000


因為只需要知道方案數,還需要模數,數據範圍也在1000範圍內,可以想到選擇區間dp,

因為每個序列都只有可能在兩端插入人,所以可以想到開一維來記錄從左端點和右端點插入人的方案數,

這樣就能寫出轉移方程:

  上一个人插到右边
        if(a[i]<a[j])f[i][j][0]+=f[i+1][j][1];
        if(a[j]>a[j-1])f[i][j][1]+=f[i][j-1][1];
        左边
        if(a[j]>a[i])f[i][j][1]+=f[i][j-1][0];
        if(a[i]<a[i+1])f[i][j][0]+=f[i+1][j][0];

#include<iostream>
#include<cstdio>
using namespace std;
int n,a[];
int f[][][];//f i,j 0/1表示区间为i,j加入的人在左/右端的方案数
const int mod=;
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&a[i]),f[i][i][]=;//一个人一种情况
for(int l=;l<=n;l++)//区间dp
for(int i=;i<=n-l+;i++){
int j=i+l-;
//上一个人插到右边
if(a[i]<a[j])f[i][j][]+=f[i+][j][];
if(a[j]>a[j-])f[i][j][]+=f[i][j-][];
//左边
if(a[j]>a[i])f[i][j][]+=f[i][j-][];
if(a[i]<a[i+])f[i][j][]+=f[i+][j][];
f[i][j][]%=mod;
f[i][j][]%=mod;
}
printf("%d",(f[][n][]+f[][n][])%mod);//不能忘了模mod
}

結尾不要忘了膜mod,而且記錄區間左右端點的狀態好像也是很常用的方法

最新文章

  1. tiny6410在I2c用户态中的程序设计eeprom
  2. Beta冲刺---Day2
  3. JavaScript中的变量及数据类型
  4. HTML5外包
  5. Cocos2d-x3.2 使用物理引擎进行碰撞检测[转]
  6. 剑指Offer13 链表倒数第K个结点
  7. WebView线性进度条
  8. devexpress中gridview控件编辑时改变输入法状态
  9. linux下多线程踩过的坑(不定更新)
  10. 获取手机root的方法
  11. Javascript中Function,Object,Prototypes,__proto__等概念详解
  12. 配置linux实现路由功能
  13. 进程管理之wait和waitpid
  14. 前端笔记之移动端&amp;响应式(上)媒体查询&amp;Bootstrap&amp;动画库&amp;zepto&amp;velocity
  15. Codeforces962F Simple Cycles Edges 【双连通分量】【dfs树】
  16. faster rcnn源码阅读笔记2
  17. ElasticSearch 例子
  18. 3dmax多个版本软件的安装包以及安装教程
  19. ASP.NET Web API 异常处理 HttpResponseException 以及Angularjs获取异常信息并提示
  20. 全网最详细的Windows系统里Oracle 11g R2 Client客户端(64bit)安装后的初步使用(图文详解)

热门文章

  1. HTML layout高仿QQ GUI
  2. html5--5-5 绘制填充矩形
  3. php数组合并
  4. v-for指令用法二
  5. SPOJ Find the max XOR value(二进制,贪心即可)
  6. BZOJ_3231_[Sdoi2008]递归数列_矩阵乘法
  7. JDBCTool
  8. bzoj 4711 小奇挖矿 ——“承诺”类树形dp
  9. win8.1安装出错解决方法之一
  10. Game of Peace