注意:
有的时候memset会出问题
思路:
i代表A,j代表B,题目要求n个AB,m个BA,所以在一个字符串中,前n个A贡献给AB中的A,前m个B贡献给BA中的B,这里用到贪心的思想
所以当i<=n时,直接用于贡献给AB中的A,当i>n时,i-n个A用来组成BA,因此当j>i-n时,此时可以放A组成BA,例如当j=3,i-n=2时,可以再放一个A组成3个BA,dp[i+1][j]=dp[i+1][j]+dp[i][j];同理,当i>j-m时,可以放B组成BA;最后不要忘了%mod.
代码:
#include<iostream> using namespace std; const int maxn = 2005; const int mod = 1e9+7; int dp[maxn][maxn]; int main(){ int n,m; while(cin>>n>>m){ for(int i=0;i<=n+m;i++) for(int j=0;j<=n+m;j++) dp[i][j]=0; dp[0][0]=1; for(int i=0;i<=n+m;i++){ for(int j=0;j<=n+m;j++){ if(j+n>i) dp[i+1][j] = (dp[i+1][j]+dp[i][j])%mod; if(i+m>j) dp[i][j+1] = (dp[i][j+1]+dp[i][j])%mod; } } cout<<dp[n+m][n+m]<<endl; } return 0; }