栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【合唱队】题解

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【合唱队】题解

[HNOI2010]合唱队 题目描述

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

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

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

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

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

  • 1850 1850 1850。

  • 1850 , 1900 1850, 1900 1850,1900,因为 1900 > 1850 1900 > 1850 1900>1850。

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

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

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

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

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

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

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

输入格式

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

输出格式

输出一行一个整数,表示答案   m o d   19650827 bmod 19650827 mod19650827 的值。

样例 #1 样例输入 #1
4
1701 1702 1703 1704
样例输出 #1
8
提示

对于 30 % 30% 30% 的数据, n ≤ 100 n le 100 n≤100。
对于 100 % 100% 100% 的数据, n ≤ 1000 n le 1000 n≤1000, 1000 ≤ h i ≤ 2000 1000 le h_i le 2000 1000≤hi​≤2000。

题 意 : 给 出 一 个 序 列 a 和 对 应 转 换 方 程 , 求 其 原 来 的 可 能 序 列 的 个 数 题意:给出一个序列a和对应转换方程,求其原来的可能序列的个数 题意:给出一个序列a和对应转换方程,求其原来的可能序列的个数

状 态 表 示 : f [ i ] [ j ] : 储 存 一 个 p a i r 。 p a i r 的 f i r s t 表 示 : 从 a [ i ] − a [ j ] , 对 应 的 原 来 的 可 能 序 列 的 最 后 一 个 插 入 的 值 , s e c o n d 表 示 个 数 状态表示:f[i][j]:储存一个pair。pair的first表示:从a[i]-a[j],对应的原来的可能序列的最后一个插入的值,second表示个数 状态表示:f[i][j]:储存一个pair。pair的first表示:从a[i]−a[j],对应的原来的可能序列的最后一个插入的值,second表示个数

思 路 : 考 虑 最 后 一 个 插 入 的 元 素 是 a [ i ] 还 是 a [ j ] 。 若 为 a [ i ] , 则 一 定 是 大 于 a [ i + 1 ] − a [ j ] 的 最 后 一 个 插 入 的 元 素 才 插 入 进 来 的 。 可 以 看 出 有 明 显 的 区 间 d p 的 痕 迹 思路:考虑最后一个插入的元素是a[i]还是a[j]。若为a[i],则一定是大于a[i+1]-a[j]的最后一个插入的元素才插入进来的。可以看出有明显的区间dp的痕迹 思路:考虑最后一个插入的元素是a[i]还是a[j]。若为a[i],则一定是大于a[i+1]−a[j]的最后一个插入的元素才插入进来的。可以看出有明显的区间dp的痕迹

别 的 思 路 : 开 一 个 f [ l ] [ r ] [ 2 ] , 效 果 类 似 , 不 一 定 非 得 用 一 个 p a i r 存 储 别的思路:开一个f[l][r][2],效果类似,不一定非得用一个pair存储 别的思路:开一个f[l][r][2],效果类似,不一定非得用一个pair存储

#include 
using namespace std;
#define int long long
int ans;
const int MOD=19650827;
const int N=1000+50;
int f[N][N];
vector>>>v;//root times
int a[N];
int n;
signed main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    v.resize(N);
    for(int i=0;i
        v[i].resize(N);
    }

    for(int i=1;i<=n;i++)
    {
        v[i][i].push_back({a[i],1});
    }

    for(int len=1;len
        for(int l=1;l+len<=n;l++)
        {
            int r=l+len;
            v[l][r].push_back({a[l],0});
            v[l][r].push_back({a[r],0});

            for(auto &i:v[l+1][r])
            {
                if (a[l]
                    v[l][r][0].second=(v[l][r][0].second+i.second)%MOD;
                }
            }

            for(auto &i:v[l][r-1])
            {
                if(a[r]>i.first)
                {
                    v[l][r][1].second=(v[l][r][1].second+i.second)%MOD;
                }
            }
        }
    }
    cout<<(v[1][n][0].second+v[1][n][1].second)%MOD;

    return 0;
}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/938144.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号