zoukankan      html  css  js  c++  java
  • [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[i1,k1,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.
  • 相关阅读:
    微信开发 之 开启开发模式
    微信公众号开发 之 编辑模式使用
    分析各种Android设备屏幕分辨率与适配
    【面向对象设计模式】 适配器模式 (二)
    重构 之 总结代码的坏味道 Bad Smell (一) 重复代码 过长函数 过大的类 过长参数列 发散式变化 霰弹式修改
    【Android 应用开发】Android资源文件
    java 创建并写入文件
    隐藏 HttpClient 在console的日志
    HOW TO CHANGE THE DEFAULT KEY-VALUE SEPARATOR OF A MAPREDUCE JOB
    java 时间戳转换
  • 原文地址:https://www.cnblogs.com/philchieh/p/7466984.html
Copyright © 2011-2022 走看看