1.解决办法:动态规划
拿到这道题的第一反应是只用小于号和等于号连接,转换为求排列数的问题,但是又一细想发现涉及到等号的个数,等号相邻问题以及重复问题,问题变得非常复杂,故而放弃。
还好有大神出来讨论,特此记录学习到的东西以求自勉。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------那么就需要换一种思考问题的切入点了:
用dp[m][n]表示n个人,m个名词的情况,那么有以下关系成立:
dp[1][n]=1 #所有人并列一个名次
dp[n][n]=n! #每个人名词都不相同,转换为求全排列数的问题
dp[m][n]=m*dp[m][n-1]+m*dp[m-1][n-1] #状态转移方程 n>m>1
解释一下第三个式子:
对于n个人排m个名次的情况,假设n-1个人的名次已经排好,此时会出现两种情况:
(1)n-1个人已经排好了m个名次,那么第m个人的名次一定是这m个名次中的一个,一共有m*dp[m][n-1]种排序情况;
(2)n-1个人排好了m-1个名次,第n个人是一个新的名次,这个名次一可能存在的顺序在前面的m-1个名次中插空,
一共有m*dp[m-1][n-1]种排序情况.
所以对于