[jzoj]2938.【NOIP2012模拟8.9】分割田地

Link

  https://jzoj.net/senior/#main/show/2938

Description

  地主某君有一块由2×n个栅格组成的土地,有k个儿子,现在地主快要终老了,要把这些土地分给这些儿子。分给每个儿子的土地最小的单位是一个栅格,同时,分给同一个儿子的土地要求要相邻连续的。地主觉得分给某个儿子的土地面积至少有一个栅格,但是具体多少可以随意。

  请问,聪明的你,能够算出地主一共有多少种分土地的方法吗?也就是说要求把2*n的栅格分成k个连通区域,每个区域至少有一个栅格。

Solution

10~90分

  应该都是正解某些细节没有处理好,或者可以打个递归暴力做一下,可以得到少量的分数

100分

  这道题是道很好的DP题目,准确来说是递推,因为它有许多情况需要讨论。

  我们设f[i,k,0/1]表示你选到第i列,其中分配给k个儿子,第i列两个栅格分配给不同一个儿子为0,反之,为1。

  关键是很难想到转移。

  其中有9种情况,其实应该有12种情况,因为有的,状态一样,但是情况不一样。

  [1]、f[i,k,0]:=f[i,k,0]+f[i-1,k-2.0]

  [2]、f[i,k,0]:=f[i,k,0]+f[i-1,k-2,1]

  [3]、f[i,k,0]:=f[i,k,0]+f[i-1,k-1,1]*2

  [4]、f[i,k,0]:=f[i,k,0]+f[i-1,k-1,0]*2

  [5]、f[i,k,0]:=f[i,k,0]+f[i-1,k,0]

  [6]、f[i,k,1]:=f[i,k,1]+f[i−1,k−1,0]

  [7]、f[i,k,1]:=f[i,k,1]+f[i-1,k-1,1]

  [8]、f[i,k,1]:=f[i,k,1]+f[i-1,k,0]*2

  [9]、f[i,k,1]:=f[i,k,1]+f[i-1,k,1]

  状态怎么来呢?与前一列的状态有关,具体可以分成如下9种。盗用别人的图片

  自己手推一下,非常容易可以的出来,故本题就迎刃而解了。没有想到递推如此强大。

Code

uses math;
const
        maxn=100000007;
var
        n,m,i,k:longint;
        f:array[0..1000,-1..2000,0..2] of int64;
begin
        readln(n,m);

        f[1,1,1]:=1;
        f[1,2,0]:=1;

        for i:=2 to n do
                for k:=1 to min(i*2,m) do
                begin
                        f[i,k,0]:=(f[i,k,0]+f[i-1,k-2,0]+f[i-1,k-2,1]+f[i-1,k-1,1]*2+f[i-1,k-1,0]*2+f[i-1,k,0]) mod maxn;
                        f[i,k,1]:=(f[i,k,1]+f[i-1,k-1,0]+f[i-1,k-1,1]+f[i-1,k,0]*2+f[i-1,k,1]) mod maxn;
                end;

        writeln((f[n,m,1]+f[n,m,0]) mod maxn);

        writeln(chr(26));
end.
时间: 2024-08-02 19:26:55

[jzoj]2938.【NOIP2012模拟8.9】分割田地的相关文章

洛谷P3145 [USACO16OPEN]分割田地Splitting the Field

P3145 [USACO16OPEN]分割田地Splitting the Field 题目描述 Farmer John's NN cows (3 \leq N \leq 50,0003≤N≤50,000) are all located at distinct positions in his two-dimensional field. FJ wants to enclose all of the cows with a rectangular fence whose sides are pa

[jzoj 6084] [GDOI2019模拟2019.3.25] 礼物 [luogu 4916] 魔力环 解题报告(莫比乌斯反演+生成函数)

题目链接: https://jzoj.net/senior/#main/show/6084 https://www.luogu.org/problemnew/show/P4916 题目: 题解: 我们设$f(x)$表示最小循环节长度为x的合法序列数,那么有$ans=\sum_{d|gcd(n,m)}\frac{1}{d}f(d)$ 这是因为最小循环节为d的序列对应的环会被计算d次,比如 0101,最小循环节长度为 2(循环节为 01),其对应的环会被统计 2 次(序列 0101 与 1010)

NOIP2012模拟试题【奶牛晒衣服】

1.奶牛晒衣服(dry) [问题描述] 在熊大妈英明的带领下,时针和它的同伴生下了许多牛宝宝.熊大妈决定给每个宝宝都穿上可爱的婴儿装.于是,为牛宝宝洗晒衣服就成了很不爽的事情. 圣人王担负起了这个重任.洗完衣服后,你就要弄干衣服.衣服在自然条件下用1的时间可以晒干A点湿度.抠门的熊大妈买了1台烘衣机.使用烘衣机可以让你用1的时间使1件衣服除开自然晒干的A点湿度外,还可烘干B点湿度,但在1的时间内只能对1件衣服使用. N件的衣服因为种种原因而不一样湿,现在告诉你每件衣服的湿度,要你求出弄干所有衣服

NOIP2012模拟试题 121105【奶牛排队(tahort)

3.奶牛排队(tahort) [ 问题描述] 奶牛在熊大妈的带领下排成了一条直队. 显然,不同的奶牛身高不一定相同…… 现在,奶牛们想知道,如果找出一些连续的奶牛,要求最左边的奶牛A是最矮的,最右边的B是最高的,且B高于A奶牛,中间如果存在奶牛,则身高不能和A.B奶牛相同.问这样的奶牛最多会有多少头? 从左到右给出奶牛的身高,请告诉它们符合条件的最多的奶牛数(答案可能是0,2,但不会是1). [输入] 第一行一个数N (2≤N≤l00000),表示奶牛的头数. 接下来N个数,每行一个数,从上到下

【NOIP2012模拟8.20】Memory

题目 话说某一天,CD在爬树的时候发现了树干上有一大串奇怪的符文,于是好奇的CD就从头到尾看了一遍.看完一遍以后CD觉得,最后一段文字好像很眼熟,好像在前面见过.对于CD来说,一开始看到的符文会印象特别深刻,而且这段符文要出现多次,CD才会觉得眼熟. 其实现在就是,CD会告诉你他看到的符文具体是什么,你要告诉CD,这段符文里最长的既是前缀又是后缀还在中间某个地方出现过(非前缀非后缀的出现)的最长的子串是什么. 分析 研究了一下kmp,发现 \(next\)数组表示在字符串\(s\)中,\(s[1

【NOIP2012模拟10.25】旅行

题目 给定一个n行m列的字符矩阵,'.'代表空地,'X'代表障碍.移动的规则是:每秒钟以上下左右四个方向之一移动一格,不能进入障碍. 计算:在空地中随机选择起点和终点(可以重合,此时最短耗时为0),从起点移动到终点最短耗时的平均值. 每一行每一列至多有1个障碍,并且障碍不在对角线方向相邻.以下矩阵是不合法的: .X X. 分析 50%的数据,全都是空地,答案就是所有两点间的曼哈顿距离和. 很容易求,\({第i行空地的数量}*{第j行空地的数量}*|i-j|*2\) 因为每一行每一列至多有1个障碍

P3145 [USACO16OPEN]分割田地Splitting the Field

题目描述 Farmer John's NN cows (3 \leq N \leq 50,0003≤N≤50,000) are all located at distinct positions in his two-dimensional field. FJ wants to enclose all of the cows with a rectangular fence whose sides are parallel to the x and y axes, and hewants thi

[编程题] 分田地

牛牛和 15 个朋友来玩打土豪分田地的游戏,牛牛决定让你来分田地,地主的田地可以看成是一个矩形,每个位置有一个价值.分割田地的方法是横竖各切三刀,分成 16 份,作为领导干部,牛牛总是会选择其中总价值最小的一份田地, 作为牛牛最好的朋友,你希望牛牛取得的田地的价值和尽可能大,你知道这个值最大可以是多少吗? 输入描述: 每个输入包含 1 个测试用例.每个测试用例的第一行包含两个整数 n 和 m(1 <= n, m <= 75),表示田地的大小,接下来的 n 行,每行包含 m 个 0-9 之间的数

linux下利用split分割大文件

使用split分割大文件 在我们的实际生产环境中,会产生许许多多的大文件,这些文件的大小不一,有的甚至会有好几十T的大小,那么我们对这些文件进行分析时,又该如何下手呢?这时我们便可以使用linux下自带的一个命令split来实现文件的分割. Split对文件的分割支持按照行数的分割,以及支持按照大小分割两种模式.要说明的是,在二进制文件中,没有'行'的概念,所以二进制文件无法使用行分割,而只能按照文件的大小来进行分割. 本次实验自行分割出一个500M大小的文件,如下图: 我们来对这个模拟文件进行