诸侯安置

Problem Description
很久以前,有一个强大的帝国,它的国土呈正方形状(转45度看),如图所示。

这个国家有若干诸侯。由于这些诸侯都曾立下赫赫战功,国王准备给他们每人一块封地(正方形中的一格)。但是,这些诸侯又非常好战,当两个诸侯位于同一行或同一列时,他们就会开战。如下图为n=3时的国土,阴影部分表示诸侯所处的位置。前两幅图中的诸侯可以互相攻击,第三幅则不可以。
国王自然不愿意看到他的诸侯们互相开战,致使国家动荡不安。因此,他希望通过合理的安排诸侯所处的位置,使他们两两之间都不能攻击。
现在,给出正方形的边长n,以及需要封地的诸侯数量k,要求你求出所有可能的安置方案数。(n≤100,k≤2n2-2n+1)
由于方案数可能很多,你只需要输出方案数除以504的余数即可。
Input
仅一行,两个整数n和k,中间用一空格隔开。
Output
一个整数,表示方案数除以504的余数。
Sample Input
2 2
Sample Output
4
Tip
四种安置方案如图所示。注意:镜面和旋转的情况属于不同的方案。

观察本题,很显然,我们会发现本题类似于八皇后问题。
当然,这道题跟八皇后问题的很不相同。因为,如果我们从左向右观察,我们会发现,它的宽度从1向2n-1,以2为公差递增,呈等差数列,而后对称。
因此,它的宽度变化是先单调递增,而后单调递减的。
如果我们只看一半,我们可以发现,如果对于前i列,它们的宽度为2i-1,那么如果我们已知这样一个函数f[i][j],表示前i列有j个诸侯的可能数,通过之前的规律我们知道,新的一列i+1,诸侯可以出现的地方有2i-1-j。
因此,就有递推方程f[i][j]=f[i-1][j-1]*(2i-1-j)
但是,如果前面的这一列,也就是 i-1 列没有诸侯,我们怎么处理呢,那么,我们就可以得到一个让之前的 i-1 变化一下,变成 f[i][j]=∑f[i-k][j-1] (1≤k≤i-1)
这样,我们就可以明确f[i][j]的含义,是在第i列存在诸侯,前i列有j个诸侯的可能数。
这样,我们就可以完整的记录所有的情况了。
因为f[i][j] 与 f[i-1][j]它们所包含的情况必然是不存在交集的。
所以,我们的思路可以朝着这个方向进行。
但是,问题在于,题目描述中,领土是先递增,后减少,不能够用这个函数来完整描述。
不过,我们想一想。对于一个诸侯来说,与它在同一行不能存在其他诸侯,与它在同一列不能存在其他诸侯。
但是,如果我们将这一列与另一列调换,保证不生成新的行(也就是说,调换后所有各自仍然连在一起,不能因为列的改变导致一行出现中间隔断的情况)最简单的调换方法就是,将列的宽度进行排序,这样就可以直接得到一个宽度递增的一个图形。
如图所示:
并且,我们可以知道,对于这个图形来说,它相同宽度的列只有两个(除最大宽度列),那么,我们就可以通过刚才推到的递推式,再根据它的限制,列的宽度限制,进行递推,就可以得到答案了。
代码如下。

#include <cstdio>
#include <iostream>using namespace std;int f[210][2000];
int n,k,ans,p;int main()
{scanf("%d%d",&n,&k);f[0][0]=1;if (k+1<=2*n){for (int i=1;i<=n;i++)for (int j=1;j<=((i<n)?2:1);j++){++p;for (int c=1;c<=min(p,k);c++)for (int r=0;r<p;r++)(f[p][c]+=f[r][c-1]*(i*2-c))%=504;}for (int i=0;i<=p;i++)ans+=f[i][k];ans%=504;}printf("%d",ans);return 0;
}

诸侯安置 简单的递推相关推荐

  1. URAL 1513. Lemon Tale(简单的递推)

    写几组数据就会发现规律了啊. .但是我是竖着看的.. .还找了半天啊... 只是要用高精度来写,水题啊.就当熟悉一下java了啊. num[i] = 2*num[i-1]-num[i-2-k]. 15 ...

  2. 百练2786 Pell数列--简单DP(递推)

    描述 Pell数列a1, a2, a3, -的定义是这样的,a1 = 1, a2 = 2, - , an = 2 * an − 1 + an - 2 (n > 2). 给出一个正整数k,要求Pe ...

  3. UVA10943简单递推

    题意:      给你两个数字n,k,意思是用k个不大于n的数字组合(相加和)为n一共有多少种方法? 思路:       比较简单的递推题目,d[i][j]表示用了i个数字的和为j一共有多少种情况,则 ...

  4. 震惊!递推与递归竟然可以这么编!%99的程序员都不知道!

    四.归并排序(逆序对) (一).归并排序 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全 ...

  5. 【算法设计与分析】09 递推方程与算法分析

    关于什么是递推方程,这里就不再多说了.本文主要讲讲简单的递推方程来求解算法的时间复杂度 文章目录 1. 递推方程的引入 1.1 插入排序时间复杂度求解 1.2 二分归并排序时间复杂度求解 2 总结 1 ...

  6. POJ 3734 Blocks 矩阵递推

    POJ3734 比较简单的递推题目,只需要记录当前两种颜色均为偶数, 只有一种颜色为偶数 两种颜色都为奇数 三个数量即可,递推方程相信大家可以导出. 最后来个快速幂加速即可. #include< ...

  7. Bailian2758 菲波那契数列(2)【递推】

    2758:菲波那契数列(2) 总时间限制: 1000ms 内存限制: 65536kB 描述 菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和. 给出一个正整 ...

  8. 2022蓝桥杯B组—积木画——递推算法

    积木画 题目描述 小明最近迷上了积木画,有这么两种类型的积木,分别为 III 型(大小为 222 个单位面积)和 LLL 型(大小为 333 个单位面积): 同时,小明有一块面积大小为 2×N2×N2 ...

  9. TSOJ 好好做题(屑)——递推状态压缩+高精度

    文章目录 题目描述 解题思路 喜闻乐见的AC代码 补充一:高精度 补充二:状态压缩 完整注释代码 后记 题目描述 选修程序设计和算法课程的学生人数为 n,任课老师设置了 m 道练习题目(其中:1 &l ...

最新文章

  1. 使用时空-频率模式分析从脑电数据的一些试验中提取N400成分
  2. 怎么在html中加判断,css样式里面如何做判断
  3. matchTemplate函数
  4. web前端开发入门基础教程系列
  5. 测试插件-infinitest介绍
  6. Ubuntu9.04 Update software Sources
  7. python一次性输入3个数_python实现输入数字的连续加减方法
  8. 手风琴案例jquery写法
  9. 解决:[ERROR] Error executing Maven. [ERROR] 1 problem was encountered while building the effective set
  10. php使用jasperreport,php-报表引擎指南(Pentaho,JasperReports,BIRT)
  11. 草莓软件验证系统源码 附带易语言模块
  12. cisco ***笔记
  13. Java基础知识点复习知识点(一)变量,流程控制,数组
  14. 【笔记】西门子1200PLC和V90伺服电机连接
  15. java逆向工程_逆向工程 - Simon.Jiang - 博客园
  16. atom n270 cpu linux,继续改造ATOM N270增加千兆口自制软路由
  17. Java小游戏,防止物体跑出四周边界的算法
  18. 【后缀数组】【线段树】codeforces102028H Can You Solve the Harder Problem?
  19. flutter去除阻尼效果
  20. Netty -Netty心跳检测机制案例,Netty通过WebSocket编程实现服务器和客户端长链接

热门文章

  1. 麦当劳“制服黑丝”,火了!
  2. 计算机普通话水平测试有用吗,计算机辅助普通话水平测试的优点与问题
  3. App在appstore下架的方法
  4. 体会视觉的震撼,从10亿光年到0.1飞米
  5. 学波尔还是学王励勤?-----再谈正手弧圈的重心转移
  6. 对话MVP | 柳贵:在FISCO BCOS,我体会到了开源社区的精神
  7. 操作系统——Liunx系统基础知识
  8. 《战胜华尔街》书中的精髓:业余投资者如何根据行业特点选好股票,赚得比专业的投资者还要多?
  9. 基于改进层次凝聚聚类算法的垃圾收运跨区域调度策略
  10. demon算法 matlab,Ncut图像分割算法MATLAB实现