见过类似的问题,参见http://
discuss.codechef.com/questions/1968/maxgame-editorial不过那个问题没有限制对角线的个数(m),而且K=1的时候是要求对角线不能共点。
@
zellux说的会导致重复情况被算了多次,不过做法类似。
放对角线的过程可以看做:
给一个n个点多边形形状的蛋糕,然后每次沿着2个顶点切一刀,(这两块蛋糕有一块只有1个刀痕,另一块有2个刀痕),留下那个有1个刀痕的,重复上面的过程。
有个问题是重复计算,比如(0,1,2,3,4,5)的一个方案是(0,4)(0,3)(1,3),先切(0,4)或(1,3)都会产生这个结果。不过还好,这种对于每种方案,只重复了2次(这里需要一些抽象思维),因为切蛋糕的顺序只能是(0,4)(0,3)(1,3)或者(1,3)(0,3)(0,4),两种方案是顺序反过来的。
下面说做法:
首先考虑在一个n点多边形(蛋糕^^)放一条对角线,会把多边形分成 i个点 和 n-i+2个点的两个多边形(稍微比划一下就能想出来),只在i个点那个多边形里继续操作,然后将最后的合法方案数/2。
递归是非常慢的,实现上使用动态规划就可以了。
dp[n][m]表示在个n点多边形放m个对角线的方案数,dp[n][m] = sum( dp[i][m-1] ),i=3~n-i-1
两个循环即可,复杂度O(n*n*m)