版权声明:转载请注明出处 https://blog.csdn.net/FSAHFGSADHSAKNDAS/article/details/81636988
链接
http://acm.hdu.edu.cn/showproblem.php?pid=4055
题解
这题代码就这么短!但是不好想
表示
的排列,最后一个数字是
,能够得到的符合前
个符号的序列个数
当符号为
时,
显然
位置要放一个大于
的,也就是
,但是我没有
啊,这怎么转移?考虑因为
在最后一个数字,所以前
个位置只有
种数字,它们是
,如果我把
都减去
,这样不就回到了
?
所以
当
时
当
时
当
时
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cctype>
#include <cmath>
#define maxn 1010
#define ll_inf (1ll<<60)
#define ll long long
#define cl(x,y) memset(x,y,sizeof(x))
#define mod 1000000007
using namespace std;
int f[maxn][maxn], s[maxn][maxn], N;
char str[maxn];
void dp()
{
int i, j;
cl(f,0), cl(s,0);
s[1][1]=f[1][1]=1;
N=strlen(str+2)+1;
for(i=2;i<=N;i++)for(j=1;j<=i;j++)
{
if(str[i]=='D')f[i][j]=(s[i-1][i-1]-s[i-1][j-1])%mod;
if(str[i]=='I')f[i][j]=s[i-1][j-1];
if(str[i]=='?')f[i][j]=s[i-1][i-1];
s[i][j]=(s[i][j-1]+f[i][j])%mod;
}
printf("%d\n",(s[N][N]+mod)%mod);
}
int main()
{
while(~scanf("%s",str+2))dp();
return 0;
}