[关闭]
@ysner 2018-07-31T00:54:48.000000Z 字数 1046 阅读 2016

[HDU4689]Derangement

计数 DP


题面

给出,求满足的排列的数量。

解析

一开始并不知道这状态怎么设
表示当前填到了第个位置,有(即号)不满足。
则可顺利写出决策:

这种“延时”我似乎只会用它来计数。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. #define re register
  8. #define il inline
  9. #define ll long long
  10. #define max(a,b) ((a)>(b)?(a):(b))
  11. #define min(a,b) ((a)<(b)?(a):(b))
  12. #define fp(i,a,b) for(re int i=a;i<=b;i++)
  13. #define fq(i,a,b) for(re int i=a;i>=b;i--)
  14. using namespace std;
  15. char s[25];
  16. ll n,f[25][25];
  17. il ll gi()
  18. {
  19. re ll x=0,t=1;
  20. re char ch=getchar();
  21. while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
  22. if(ch=='-') t=-1,ch=getchar();
  23. while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
  24. return x*t;
  25. }
  26. int main()
  27. {
  28. while(scanf("%s",s+1)!=EOF)
  29. {
  30. n=strlen(s+1);memset(f,0,sizeof(f));
  31. f[0][0]=1;
  32. fp(i,1,n)
  33. {
  34. if(s[i]=='+')
  35. fp(j,1,i)
  36. f[i][j]+=f[i-1][j-1]+f[i-1][j]*j;
  37. else
  38. fp(j,0,i)
  39. {
  40. f[i][j]+=f[i-1][j]*j+f[i-1][j+1]*(j+1)*(j+1);
  41. }
  42. }
  43. printf("%lld\n",f[n][0]);
  44. }
  45. return 0;
  46. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注