2019CCPC 哈尔滨 I Interesting Permutation(计数dp)

题意:定义 f i = m a x ( a 1 , a 2 , . . . a i ) , g i = m i n ( a 1 , a 2 , . . . a i ) , h i = f i g i f_i=max(a_1,a_2,...a_i), g_i=min(a_1,a_2,...a_i),h_i=f_i-g_i ,现给定一组 h i h_i ,求满足该 h i h_i 的排列数。
题解摘自官方题解。
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=100010;
const int mod=1e9+7;

int a[maxn],n;
ll dp[maxn];
int main(){
    int t;scanf("%d",&t);
    a[0]=0;
    while(t--){
        scanf("%d",&n);
        bool flag=1;
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            if(a[i]<a[i-1]||a[i]>=n||(i!=1&&a[i]<=0))
                flag=0;
        }
        if(!flag||a[1]!=0){
            puts("0");continue;
        }
        dp[1]=1;
        for(int i=2;i<=n;i++){
            if(a[i]>a[i-1])
                dp[i]=dp[i-1]*2%mod;
            else
                dp[i]=dp[i-1]*(a[i]-i+2)%mod;
        }
        printf("%I64d\n",dp[n]);
    }
    return 0;
}

发布了71 篇原创文章 · 获赞 1 · 访问量 2827

猜你喜欢

转载自blog.csdn.net/weixin_43918473/article/details/103039860