互不侵犯(BZOJ1087) 题解

这是一个关于在N×N棋盘上放置K个国王的问题,要求他们互不攻击。给定一个样例输入(3 2),其输出为16。解题思路采用状态压缩动态规划,通过预处理所有可行的国王摆放位置,以减少动态规划的计算次数。设f[i,j,k]表示第i行、使用第j种方案、共摆放k个国王的方案数,动规条件是f[i,j,k]=∑f[i-1,s,t](s与j不冲突,t≤k)。代码实现中需要记录每个可行方案的国王数量和攻击范围,满足条件的s需满足s and j=0。" 97518292,8708493,Mybatis注解与动态SQL解析,"['mybatis', 'springboot', '数据库操作', '注解编程', '动态SQL']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【题目描述】

    在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子。

【样例输入】

    3 2

【样例输出】

    16

【解题思路】

    本题为SCOI2005的题,正解应该是状态压缩动态规划,把所有方案变为二进制存储,1为该位置摆放了国王,0为没有,因为一行最多九个格子,也就是说最多为511,空间上完全可以接受。然后我们可以先预处理一下所有可行的国王摆放的位置,以减少动规的次数,设f[i,j,k]为现在是第i行,用第j种方案,一共摆放了k个国王的总方案数,那么我们动规的条件就是f[i,j,k]=∑f[i-1,s,t]{s为与j不冲突的方案,t<=k}

    于是对于每个可行方案,我们需要记录一些东西:这个可行方案摆了多少国王,这个可行方案的攻击范围。那么满足条件的s即为s and j=0。

【代码实现】

 1 type rec=record
 2      j,l,p:longint;
 3 end;
 4 var f:array[1..9,0..512,0..80] of int64;
 5     n,m,i,j,w,k,q,total,l:longint;
 6     ans:int64;
 7     fl:boolean;
 8     fa:array[1..500] of rec;
 9 procedure dfs(w,dep,t:longint);
10 var i:longint;
11     s:string;
12     ch:string;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值