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

來源:題解


题目描述

为了在即将到来的晚会上有更好的演出效果,作为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,而且記錄區間左右端點的狀態好像也是很常用的方法

[題解]luogu_P3205/BZOJ_1996 合唱隊的更多相关文章

  1. [題解](單調隊列dp)【2016noip福建夏令營】探險

    P1917 -- 探险 时间限制:1000MS      内存限制:131072KB 题目描述(explore.cpp) π+e去遗迹探险,遗迹里有 N 个宝箱,有的装满了珠宝,有的装着废品. π+e ...

  2. [題解](單調隊列dp)luogu_P1725琪露諾

    比較簡單的單調隊列,但是有一些要注意的 維護單調隊列的時候裡面存的是入隊時間,而不是i,因為前面有l個沒有入隊(不可能走進),所以把i减一个l以达到延迟入队的效果 #include<bits/s ...

  3. [題解](單調隊列/水)luogu_P3088擠奶牛

    d長度內區間最大值,單調隊列維護即可 由於需要滿足左右同時有2倍高度的牛才能更新答案,所以正反跑兩次 #include<bits/stdc++.h> using namespace std ...

  4. [題解](二分答案/單調隊列)luogu_P1419尋找段落

    果然又抄的題解... 顯然答案具有單調性,而對于平均數計算的式子我們移一下項, 若s[l..r]>mid*(r-l+1)无解, 於是我們把每個數都減去一個mid,看和的正負即可,如果為正就可能有 ...

  5. [題解](水/數學)luogu_P1147連續自然數和

    尺取法a掉 然而數學解法為 等差數列求和公式: sum(L,R)=(L+R)(R-L+1)/2=M 即(L+R)(R-L+1)=2M 可以把2M分解成两个数之积,假设分成了两个数K1,K2,且K1&l ...

  6. [題解](最小生成樹/LCA)luogu_P1967貨車運輸

    一道好題不出所料又抄的題解 1.首先對於這張圖肯定要考慮走哪些邊不走哪些邊,發現我們想要的肯定那些邊權最大的邊,所以想到最大生成樹 這樣能保證選到盡量大的邊 2.跑完最大生成樹后每兩點之間就有唯一路徑 ...

  7. [題解](最小生成樹)luogu_P1265

    首先考虑最小生成树的模型,唯一不同的是第二种情形. 即“三个或三个以上的城市申请修建的公路成环” 考虑该情形,因为修路的申请是申请离它最近的城市,所以上述条件实质上为 “存在三个或三个以上的城市,他们 ...

  8. [題解]luogu_P1120小木棍(搜索)

    好久以前抄的題解,現在重新抄題解做一下 1.對所有木棍從大到小排序,後用小的比較靈活 2.限制加入的木棍單調遞減,因為先/后用長/短木棍等價,反正就是那兩根 3.預處理出重複木棍的位置,防止重複搜索相 ...

  9. [題解](最短路)luogu_P1119災後重建

    一道好題,然而看題解做的...... floyed的實質:只經過前k個點i到j的最短路,原狀態轉移方程為 f [ k ] [ i ] [ j ]=min( f[ k-1 ] [ i ] [ j ],f ...

随机推荐

  1. RTP/RTCP学习笔记 -- RFC 3550

    The MTU of RTP package payload is (IP) - (UDP) - = 1472   #define DEFAULT_MAX_PACKET_SIZE 1200 video ...

  2. 如何修改sublime3注释的颜色

    在用sublime text3编写Python2代码时总觉得注释颜色太浅了, 看起来吃力,于是就尝试去修改,和sublime text2不同, sublime text3的主题配置文件在Sublime ...

  3. Dockerfile指令:

    Dockerfile指令: 第一行注释,指令是大写字母开头, FROM指令: FROM<image>,后面跟镜像名, FROM<image>:<tag>,后面跟镜像 ...

  4. Android Weekly Notes Issue #242

    Android Weekly Issue #242 January 29th, 2017 Android Weekly Issue #242 本期内容包括: Android中常用的设计模式; 基于No ...

  5. codeforces 465C.No to Palindromes! 解题报告

    题目链接:http://codeforces.com/problemset/problem/464/A 题目意思:给出一个长度为 n 且是 tolerable 的字符串s,需要求出字典序最小的长度也为 ...

  6. 自建 AppRTC

    自建 AppRTC 字数3158 阅读1718 评论2 喜欢2 AppRTC 是 webrtc 的一个 demo.自建 AppRTC 可以苦其心志劳其筋骨饿其体肤,更重要的是能学会 webrtc 服务 ...

  7. python 特殊方法之new

    object.__new__(cls[, ...]) Called to create a new instance of class cls. __new__() is a static metho ...

  8. 在SQL SERVER 2008中通过已有的数据库生成建库脚本

  9. SSH框架中hibernate 出现 user is not mapped 问题

    SSH框架中hibernate 出现 user is not mapped 问题      在做SSH框架整合时,在进行DAO操作时.这里就只调用了chekUser()方法.运行时报  user is ...

  10. ubuntu 常见问题解决

    1.更新出现Could not get lock /var/lib/apt/lists/lock问题解决方法: 首先输入命令:sudo rm /var/lib/apt/lists/* -vf 执行完成 ...