标签:
2 3 2 1 1 2 2 3 5 5 4 3 2 1 1 2 3 4 5
1 0HintIn the first example, there is only one valid permutation (2,1,3) . In the second example, it is obvious that there is no valid permutation.
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long LL;
const int mod =998244353;
const int N=100005;
int b[N];
int c[N];
LL dp[N];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int Min=999999;
int Max=-1;
int flag=1;
for(int i=1;i<=n;i++)
{
scanf("%d",&b[i]);
if(b[i]>Min) flag=0;
if(b[i]<1||b[i]>n) flag=0;
Min=min(Min,b[i]);
}
for(int i=1;i<=n;i++)
{
scanf("%d",&c[i]);
if(c[i]<Max)flag=0;
if(c[i]<1||c[i]>n) flag=0;
if(c[i]<b[i]) flag=0;
Max=max(Max,c[i]);
}
if(!flag||c[1]!=b[1]) puts("0"); //前 1个的最大最小值一定相等 ,都是这个数嘛
else
{
memset(dp,0,sizeof(dp));
dp[1]=1;
int num=1;
for(int i=2;i<=n;i++) //dp核心
{
if(c[i]==c[i-1]&&b[i]==b[i-1]&&b[i]!=c[i])
{
dp[i]=dp[i-1]*(c[i]-b[i]+1-num)%mod;
}
else if( b[i]<b[i-1]&&c[i-1]==c[i] || b[i]==b[i-1]&&c[i-1]<c[i] )
{
//dp[i] = dp[i-1]+1;
dp[i]=dp[i-1];
}
num++; //已经选了多少种
}
printf("%I64d\n",dp[n]);
}
}
return 0;
}HDU 5719 BestCoder 2nd Anniversary Arrange (DP)
标签:
原文地址:http://blog.csdn.net/liangzhaoyang1/article/details/51942335