[DP] [组合数学] [BZOJ4807] 車

题目传送门
蛤蛤蛤蛤……高三真是狗……
(别问我开学第一周怎么度过的我不想说……)
看到题目首先想到一个DP, dp[i][j] 表示放在第 i 行第 j 列的可行方案数,于是就有如下转移辣:

dp[i][j]=k=j+1mdp[i1][k]    i[2,n],j[1,m]

答案就是:
ans=i=1mdp[n][i]

初状态是:
dp[1][i]=1    i[1,m]

应该比较好理解吧……車不能与其他車放置在同行和同列,还必须要求每个車的左上不能有其他車。
不过棋盘的放置是不确定的,可以 n 作为行也可以 m 作为行,所以把 n m 反过来再DP一遍。发现有时候 n 作为行无解有时候 m 作为行无解,有解时 n<m ,所以DP一遍就好了。
这样随便一个 O(nm2) 的DP就出来了,可是……过不去……
那么找找优化方法,注意到第二行的DP类似于对第一行做了个前缀和,每一行与前一行都错开一位做前缀和处理,所以那个DP式子中代价 O(m) 的求和就可以优化一下……
列个表看一下,其实DP方程就被优化成了这样:
dp[i][j]=dp[i][j+1]+dp[i1][j+1]    i[2,n],j[1,m]

如果学过选修2-3,就会看出这和组合数很类似啊……
(n+1m)=(nm)+(nm1)

具体证明……这个数学老师应该讲了吧……(我忘了……)
这个DP时间复杂度是 O(nm) 的,不过打一下表,发现这就是把杨辉三角顺时针旋转了 90 ,要求的值,即最后一行的和,其实就是杨辉三角中一列的和,要求的答案在杨辉三角中可以表示为:
ans=i=1m1(n1i)

这个求和还是数学课上讲过……可以化简为 (nm) ……
所以优化了一堆,就是求个组合数咯……输出最后50位……
至于 n<m ,将DP数组转置的时候自然是 m<n ,所以有 m>n 的情况只需把棋盘转一下,转成合法情况放置再转回去,就是对应的合法情况咯……
有意思的题……
时间复杂度 O(nlog2log2n+50nlog2n) ?xbb别当真……
Code

猜你喜欢

转载自blog.csdn.net/HeRaNO/article/details/77394530