jzoj2938分割田地

题意:要求把2*n的方格分成k个连通区域,每个区域至少有一个格子。问你方案数模100000007之后是多少。
题解:一个比较神奇的dp,设f[i,j,0/1],表示当前做到第i行,分成k个连通区域,第i行的两个格子属于/不属于同一个连通区域,
然后要分类讨论一下:
首先是f[i,j,0]的转移:
有如下几种情况:
这里写图片描述
f[i1,j1,1]转移过来
这里写图片描述
f[i1,j1,1]转移过来。
这里写图片描述
f[i1,j2,1]转移过来。
这里写图片描述
f[i1,j,0]转移过来。
这里写图片描述
f[i1,j1,0]转移过来。
这里写图片描述
f[i1,k1,0]转移过来。
这里写图片描述
f[i1,j2,0]转移过来。
所以
f[i,j,0]:=(f[i1,j1,1]2+f[i1,j2,1]+f[i1,j,0]+f[i1,j1,0]2+f[i1,j2,0])
然后f[i,j,1]的转移类似,自己想一想吧。

贴上代码

const
        maxn=1005;
        mo=100000007;
var
        f:array[0..maxn,-1..2*maxn,0..1] of int64;
        i,j,n,k:longint;
begin
        readln(n,k);
        f[1,1,1]:=1;
        f[1,2,0]:=1;
        for i:=2 to n do
        begin
                for j:=1 to k do
                begin
                        f[i,j,0]:=(f[i-1,j-1,1]*2+f[i-1,j-2,1]+f[i-1,j,0]+f[i-1,j-1,0]*2+f[i-1,j-2,0]) mod mo;
                        f[i,j,1]:=(f[i-1,j,0]*2+f[i-1,j,1]+f[i-1,j-1,1]+f[i-1,j-1,0]) mod mo;
                end;
        end;
        writeln((f[n,k,0]+f[n,k,1]) mod mo);
        write(#26);//注明:jzoj上数据有问题,要加这个,若不在jzoj上提交,可去掉此语句。
end.

the end

由于我的水平有限,难免会有些写错的地方,希望大家批评指正,多多包容,thank you for your patience.

### 实现CSP田地丈量的Python代码 为了完成田地面积测量的任务,可以基于给定的数据结构和逻辑来编写程序。以下是完整的解决方案: #### 解决方案描述 通过分析输入数据并计算有效矩形区域的总面积,最终得出结果。具体来说,对于每一块田地,需要判断其是否位于指定范围内,并根据范围内的坐标计算实际的有效宽度和高度。 下面是具体的 Python 实现代码: ```python n, a, b = map(int, input().split()) # 输入地块数量以及限定的x轴和y轴的最大值 result = 0 # 初始化总田地面积为0 for _ in range(n): # 遍历每一组田地数据 x1, y1, x2, y2 = map(int, input().split()) # 获取当前田地的四个顶点坐标 # 计算有效的宽度 (x方向上的重叠部分) width = min(a, x2) - max(0, x1) # 计算有效的高度 (y方向上的重叠部分) height = min(b, y2) - max(0, y1) # 如果宽度和高度都大于0,则该区域有效,累加到总面积中 if width > 0 and height > 0: result += width * height print(result) # 输出总的田地面积 ``` #### 关键点解析 1. **输入处理**: 使用 `input()` 函数读取标准输入中的数据,并将其转换成整型数值以便后续运算[^1]。 2. **边界裁剪**: 对于每个田地区域,分别计算其在 `[0, a]` 和 `[0, b]` 范围内的有效长度和宽度[^2]。 3. **有效性验证**: 只有当计算得到的有效宽度和高度均为正数时,才将对应的面积加入总计之中。 4. **性能优化**: 给定约束条件下 (`n ≤ 100`),上述方法的时间复杂度为 O(n),能够高效运行。 #### 示例解释 假设样例输入如下: ``` 4 10 10 0 0 5 5 5 -2 15 3 8 8 15 15 -2 10 3 15 ``` 按照以上算法执行过程可得输出为 `44`,这与预期相符[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值