bit程设 26. Little Bishops uva 861

来源:互联网 发布:税务总局网络培训学院 编辑:程序博客网 时间:2024/05/22 17:25

一道可能不太好想的dp,

大体思路就是把图形旋转45度,就变成了只攻击水平方向和垂直方向,dp[i][j]表示前 i 行放 j 个不相互攻击的象,c[i]表示第  i 行有多少个位置。

状态方程:dp[i][j]=dp[i-1][j]+dp[i-1][j-1]*(c[i]-j+1);

翻转45度后可以把bishop全部看成车,即只能攻击横竖方向

因为每一行只能放置一个车,所以前i行有j个车可分为如下两种情况

1. j 个车全在前 i - 1 行 ,个数为dp[i - 1][j]

2.第 i 行有一个车,前 i - 1 行放置 j - 1 个车,那么前 i - 1 行在放置 j - 1 个车时已经占用 了第 i 行的 j - 1 个格子,剩余的格子数为

c[i] - (j - 1),一共是dp[i-1][j-1]*(c[i]-j+1)

再补充一下边界条件:

  • dp[i][0] = 1, 0 <= i <= n   
  • dp[0][j] = 0, 1 <= j <= k   

这道题也可以自己本地暴力回溯求出所有的答案,最后打表就好了。  直接搜索可以,每次的判断条件是所在的两条对角线。
旋转45度搜索也可以,直接成了一个菱形棋盘的八皇后问题。
/*
   代码过几天再贴
*/

0 0
原创粉丝点击