标签:
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