@ysner
2018-07-30T16:54:48.000000Z
字数 1046
阅读 2535
计数 DP
给出,求满足的的排列的数量。
一开始并不知道这状态怎么设
设表示当前填到了第个位置,有个(即号)不满足。
则可顺利写出决策:
这种“延时”我似乎只会用它来计数。
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#define re register#define il inline#define ll long long#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))#define fp(i,a,b) for(re int i=a;i<=b;i++)#define fq(i,a,b) for(re int i=a;i>=b;i--)using namespace std;char s[25];ll n,f[25][25];il ll gi(){re ll x=0,t=1;re char ch=getchar();while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();if(ch=='-') t=-1,ch=getchar();while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();return x*t;}int main(){while(scanf("%s",s+1)!=EOF){n=strlen(s+1);memset(f,0,sizeof(f));f[0][0]=1;fp(i,1,n){if(s[i]=='+')fp(j,1,i)f[i][j]+=f[i-1][j-1]+f[i-1][j]*j;elsefp(j,0,i){f[i][j]+=f[i-1][j]*j+f[i-1][j+1]*(j+1)*(j+1);}}printf("%lld\n",f[n][0]);}return 0;}
