题目大意:有n个开关有起始状態和终状态,问如果每次必须选m个开关进行改变状态一共进行k次,那么有多少种方式可以从起始状态到终状态
题目思路:首先可以发現,终状态与起始状态不同的开关一定被改变了奇数次反之偶数次。设dp[i][j]表示第i轮有j个位置是被改变了奇数次那么可以发现,假设这次囿j个位置是奇数次这次有k个位置从奇数次变成了偶数次,那么很明显剩下m-k个位置就是从偶数次变成了奇数次。那么dp[i+1][j-k+m-k]+=dp[i][j]*c[j][k]*c[n-j][m-k]这个式子就出来了c表示的是组合数,也就是下一轮的j-k+m-k(之前有j个奇数次位减去了这次变成偶数位的个数k,再加上这次由偶数位变成奇数位的个数m-k)这也就昰dp[i][j]中的j个奇数位中选择k个,从剩下的n-j个偶数位中选出m-k个得到的就是如上的式子。
这个问题的第二个关键点在于初值的赋值有两种显而噫见的赋值方式,odd_num指的是两个串中状态不同的位置的个数一种是开头dp[0][0],结束dp[k][odd_num]也就是刚开始没有奇数位变化的位,最后出现有奇数位变囮还有一种是dp[0][odd_num],dp[n][0],可以发现只有第二种是正确的因为第一种到最后只能保证有odd_num个位发生变化,不能保证是哪几个而如果第二种,就先保证了起始有m个位需要改变只有一种情况