AT_dp_t Permutation
AT_dp_t Permutation
考场上想的时候总想着分成一段一段处理(因为分来的一堆数排列方式一定),结果完全转移不了,果然我的dp跟石一样.
参考了机房另一位大佬的思路,他是一开始不考虑排列的情况,发现转移需记录当前位置的值,和能转移过来的状态,且只关心相对大小关系。
在知道这些后,就要开始根据排列的性质写转移。为防止同一个数被用两次,就按顺序依次加入每个数,枚举到第
然后按题目要求由每个位置是
对于
但对于其他已经在之前出现过的数,要统计它在此位置的贡献,好像会出现重复,且不知道
其实因为它只关心相对大小,所以相当于把
- 注意:当
> 号时要加的是f_{i-1,j} ,因为在此刻我们把j 作为第i 位时,上一个作结尾的j 它就变成j+1 了,是符合我们的转移条件的。
至于要计算
代码:
#include<bits/stdc++.h>
using namespace std;
#define MAXN 3010
const int MOD=1e9+7;
int n,f[MAXN][MAXN];
char s[MAXN];
int main(){
cin>>n>>(s+2);
f[1][1]=1;
for(int i=2;i<=n;i++)
{
if(s[i]=='<'){
for(int j=1;j<=i;j++)
f[i][j]=(f[i-1][j-1]+f[i][j-1])%MOD;
}else
for(int j=i;j>=1;j--)
f[i][j]=(f[i-1][j]+f[i][j+1])%MOD;
}
int ans=0;
for(int i=1;i<=n;i++)
ans=(ans+f[n][i])%MOD;
printf("%d\n",ans);
return 0;
}