poj1321——棋盘问题——————【状态压缩、动态规划】

/*

   解题思路:首先确定各个状态值对应的二进制中有几个1。然后初始化dp[0][0]为一种解决方案,虽然不会计入最后的结果。但是却影响着下面每行的计算。只对二进制中1的个数小于等于k的状态值操作,枚举每种状态值。本行j状态值下的方案数继承上一行j状态值下的方案数,上一行中状态为j时的dp数组如果是0时,对本行的dp结果其实无影响,产生影响的是dp[i-1][j]不为0的那个。由上一行的状态值j如果能跟#对应的状态值不冲突,则扩展出新的状态值,新的状态值对应的dp数组需要保留原来j状态的dp值(方案数)。通过两个方式来更新dp数组,一个是本行继承上一行相同状态值的dp值,另一个是在上一行j状态值基础上扩展出的本行新的状态值继承上一行j状态值的dp值。

*/

#include
#include
#include
#include
using namespace std;
int n,k,top;
char Map[10][10];
int dp[10][1<<10],legal[1<<10];
void cal_legal(){
    //计算每种状态值对应的二进制中的1的个数
    top=1<


你可能感兴趣的:(状态压缩)