//这属于完全错排问题 int totalWrong(int n) { vector<int>dp(n+1,0); dp[1]=0;dp[2]=1; for(int i=3;i<=n;++i) dp[i]=(i-1)*(dp[i-1]+dp[i-2]); return dp[n]; } //可以看看只跟前两个变量值有关,所以可以使用两个变量来节省空间 int totalWrong(int n) { int a=0,b=1; int ans=1; for(int i=3;i<=n;++i){ ans=(i-1)*(a+b); a=b;b=ans; } return (n==1)?0:ans; }