hnoi2010 合唱队 (区间dp)

题目描述
为了在即将到来的晚会上有更好的演出效果,作为 AAA 合唱队负责人的小 A 需要将合唱队的人根据他们的身高排出一个队形。假定合唱队一共有 N 个人,第 i 个人的身高为 Hi 毫米(1000≤Hi≤2000),并且已知任何两个人的身高都不同。假定最终排出的队形是 N 个人站成一 排。

为了简化问题,小 A 想出了如下排队的方式:他让所有的人先按任意顺序站成一个初始队形,然后从左到右按以下原则依次将每个人插入最终排出的队形中: - 第一个人直接插入空的当前队形中。 - 对从第二个人开始的每个人, ? 如果他比前面那个人高(H 较大),那么将他插入当前队形的最右边。 ? 如果他比前面那个人矮(H 较小),那么将他插入当前队形的最左边。

当 N 个人全部插入当前队形后便获得最终排出的队形。 例如,有 6 个人站成一个初始队形,身高依次为 1850、1900、1700、1650、1800 和 1750, 那么小 A 会按以下步骤获得最终排出的队形:

●1850
●1850 1900
●1700 1850 1900
●1650 1700 1850 1900
●1650 1700 1850 1900 1800
●1750 1650 1700 1850 1900 1800

因此,最终排出的队形是 1750, 1650, 1700, 1850, 1900, 1800。 小 A 心中有一个理想队形,他想知道从多少种初始队形出发能通过上述排队的方式获得他 心中的理想队形作为最终排出的队形?

输入格式
输入文件第一行是一个正整数N,表示总人数。 输入文件第二行是用空格隔开的N个正整数,从左到右表示小A心中的理想队形:H1, H2, ?, HN。 输入的数 据保证1000≤Hi≤2000且没有相同的H值, 其中30%的数据满足1≤N≤100, 100%的数据满足1≤N≤1000。

输出格式
表示从多少种初始队形出发能通过上述排队的方式获 得输入文件中指定的小 A 心中的理想队形。 因为满足条件的初始队形数可能很大,所以规定只要输出满足条件的初始队形数 mod 19650827 的值。


转移方程还是很好写的。f[ i ][ j ][ 0 ]表示当前已得到第 i~j 个人的序列,且最后一个排入的人在最左边。 f[ i ][ j ][ 1 ]则反之。

那么:
f[ i ][ j ][ 0 ] = f[ i+1 ][ j ][ 0 ] * ( h[ i+1 ] > h[ i ]) + f[ i+1 ][ j ][ 1 ] * ( h[ j ] > h[ i ]);
即,若 [ i+1,j ] 中最后一个人排在左端 i+1 处,则根据游戏规则,若此时 h[ i +1 ] > h[ i ],则这种情况成立。同理可证另一边。

总之一旦想得到就很简单啦。

#include<bits/stdc++.h>
using namespace std;

int n;
int h[1010];

int f[1010][1010][2];


inline void read(int &x)
{
    x=0;int f=1;char s=getchar();
    for(;s<'0'||s>'9';s=getchar()) if(s=='-') f=-1;
    for(;s>='0'&&s<='9';s=getchar()) x=(x<<3)+(x<<1)+s-48;
    x*=f;
}

void init()
{
    read(n);
    for(int i=1;i<=n;++i) read(h[i]);
}

void work()
{
    memset(f,0,sizeof(f));
    for(int i=1;i<=n;++i) f[i][i][0]=1;
    for(int k=2;k<=n;++k)
        for(int i=1;i<=n-k+1;++i)
        {
            int j=i+k-1;
            f[i][j][0]=(f[i+1][j][0]*(h[i+1]>h[i])%19650827+f[i+1][j][1]*(h[j]>h[i])%19650827)%19650827;
            f[i][j][1]=(f[i][j-1][0]*(h[i]<h[j])%19650827+f[i][j-1][1]*(h[j-1]<h[j])%19650827)%19650827;
        }
    printf("%d",(f[1][n][0]+f[1][n][1])%19650827);
}

int main()
{
    init();
    work();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/hfl030/article/details/80302605
今日推荐