思路:dp。
http://www.cnblogs.com/Leohh/p/8135525.html
可以参考一下这个博客,我的dp是反过来的,这样就可以边转移边求前缀和,不需要用树状数组优化。
代码:
#include<bits/stdc++.h> using namespace std; #define pb push_back #define ll long long #define mem(a,b) memset(a,b,sizeof(a)) const int N=5e3+5; const int MOD=1e9+7; int dp[N][N]; char c[N]; int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin>>n; for(int i=1;i<=n;i++)cin>>c[i]; for(int i=0;i<n;i++)dp[n][i]=1; for(int i=n-1;i>=1;i--) { int sum=0; for(int j=0;j<n;j++) { sum=(sum+dp[i+1][j])%MOD; if(c[i]=='f')dp[i][j]=(dp[i][j]+dp[i+1][j+1])%MOD; else dp[i][j]=(dp[i][j]+sum)%MOD; } } cout<<dp[1][0]<<endl; return 0; }