相當水的DP,狀態方程也很簡單:dp(m,n)=dp(m,n-1)+dp(m-1,n),其中m<n的話排列的情況不存在。 dp的精髓就是狀態方程。 [cpp] #include <iostream> #include <cstring> using namespace std; __int64 dp[21][21]; int main() { int m,n; while(cin>>m>>n) { memset(dp,0,sizeof(dp)); if(m<n) { cout<<0<<endl; continue; } else { for(int a=1;a<=m;a++) { dp[a][0]=1; } for(int i=1;i<=20;i++) { for(int j=1;j<=i;j++) { dp[i][j]=dp[i][j-1]+dp[i-1][j]; } } cout<<dp[m][n]<<endl; } } return 0; }