转自:http://www.cnblogs.com/CtsNevermore/p/6028138.html

题目背景

小a和uim来到雨林中探险。突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声。刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从天空中打落下来,只见前方出现了一个披头散发、青面獠牙的怪物,低沉着声音说:“呵呵,既然你们来到这,只能活下来一个!”。小a和他的小伙伴都惊呆了!

题目描述

瞬间,地面上出现了一个n*m的巨幅矩阵,矩阵的每个格子上有一坨0~k不等量的魔液。怪物各给了小a和uim一个魔瓶,说道,你们可以从矩阵的任一个格子开始,每次向右或向下走一步,从任一个格子结束。开始时小a用魔瓶吸收地面上的魔液,下一步由uim吸收,如此交替下去,并且要求最后一步必须由uim吸收。魔瓶只有k的容量,也就是说,如果装了k+1那么魔瓶会被清空成零,如果装了k+2就只剩下1,依次类推。怪物还说道,最后谁的魔瓶装的魔液多,谁就能活下来。小a和uim感情深厚,情同手足,怎能忍心让小伙伴离自己而去呢?沉默片刻,小a灵机一动,如果他俩的魔瓶中魔液一样多,不就都能活下来了吗?小a和他的小伙伴都笑呆了!

现在他想知道他们都能活下来有多少种方法。

输入输出格式

输入格式:

第一行,三个空格隔开的整数n,m,k

接下来n行,m列,表示矩阵每一个的魔液量。同一行的数字用空格隔开。

输出格式:

一个整数,表示方法数。由于可能很大,输出对1 000 000 007取余后的结果。

输入输出样例

输入样例#1:

2 2 3
1 1
1 1
输出样例#1:

4

说明

【题目来源】

lzn改编

【样例解释】

样例解释:四种方案是:(1,1)->(1,2),(1,1)->(2,1),(1,2)->(2,2),(2,1)->(2,2)。

【数据范围】

对于20%的数据,n,m<=10,k<=2

对于50%的数据,n,m<=100,k<=5

对于100%的数据,n,m<=800,1<=k<=15

这题还不算太难,,当初看的时候不是很理解题意,以为他们会选择两条不同的路径,导致整体思路混乱



其实理解题意和思路之后还是敲了不短的时间,一部分身体原因再加上中午休息不太好,整个人思路较乱,靠本能打了一遍代码毫无头绪。恢复了一下状态重新开打,才算是A掉

题解

设dp[i][j][l][p]为当前走到第(i, j)位,当前(a - b) % k 为l,本次是第p个人取得药,p = 0为a,p = 1 为b,
此时的方案数

则 dp[i][j][l][1] += dp[i-1][j][((l + a[i][j]) % k + k) % k][0] + dp[i][j-1][((l + a[i][j]) % k + k) % k][0]

dp[i][j][l][0] += dp[i-1][j][((l - a[i][j]) % k + k) % k][1] + dp[i][j-1][((l - a[i][j]) % k + k) % k][1]

举个栗子:

假设本次在(3, 2),该1(uim)走,则该状态的上一个状态应为 当前在(3,1),该0(小a)走,当时的差为l + a[i][j] 另一个状态同理。

解释一下差加减的原理:

我们的dp方程的第三维定义的是a(小a) - b(uim)的差,那么按照上面的栗子来看,本步由uim来走,那么它们状态的差应减少,减少值为a[i][j],所以上一状态为l + a[i][j],

扯一点关于初始化的东西

由于题目中规定可以从每个点开始,同时必须小a先吸收,所以

对于读入的每一个a[i][j],设dp[i][j][a[i][j] % k][0] = 1

其余点均为0

关于k

实在有些不理解出题人的脑洞,,(lzn别打我= =),,只有k的容量,到了k+1就会清零,,,默默地k++吧

关于复杂度

记录两个人的当前值肯定会T,使用long long会M,据说常数太大会卡两个,暂时没发现

关于差值问题:

有人说差值可正可负,我当时也考虑了一段时间,后来发现在%k意义下对答案没有任何影响,即 k = 3时,(k + 1等于4时)a比b少2和a比b多2其实是等效的,即a拿2个后两人均相同

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>

 + ;
;
][];
int a[maxn][maxn];
int n, m, k;

int main () {
    scanf("%d %d %d", &n, &m, &k);
    k++;
    ; i <= n; i++) {
        ; j <= m; j++) {
            scanf("%d", &a[i][j]);
            dp[i][j][(a[i][j]) % k][] = ;
        }
    }
    ; i <= n; i++) {
        ; j <= m; j++) {
            ; l < k; l++) {
                dp[i][j][l][] = (dp[i][j][l][] + dp[i-][j][((l + a[i][j]) % k + k) % k][] + dp[i][j-][((l + a[i][j]) % k + k) % k][]) % mod;
                dp[i][j][l][] = (dp[i][j][l][] + dp[i-][j][((l - a[i][j]) % k + k) % k][] + dp[i][j-][((l - a[i][j]) % k + k) % k][]) % mod;
            }
        }
    }
    ;
    ; i <= n; i++)
        ; j <= m; j++) {
            ans = (ans + dp[i][j][][]) % mod;
        }
    printf("%lld", ans);

    ;
}
 

P1373 小a和uim之大逃离的更多相关文章

  1. 洛古 P1373 小a和uim之大逃离

    P1373 小a和uim之大逃离 题目提供者lzn 标签 动态规划 洛谷原创 难度 提高+/省选- 题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电 ...

  2. 洛谷 P1373 小a和uim之大逃离

    2016-05-30 12:31:59 题目链接: P1373 小a和uim之大逃离 题目大意: 一个N*M的带权矩阵,以任意起点开始向右或者向下走,使得奇数步所得权值和与偶数步所得权值和关于K的余数 ...

  3. 洛谷P1373 小a和uim之大逃离

    P1373 小a和uim之大逃离 题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声.刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从 ...

  4. 【题解】 P1373 小a和uim之大逃离

    题解 P1373 小a和uim之大逃离 传送门 一道dp好题 乍看此题,感觉要这样设计: \(dp(x)(y)(mod_{a})(mod_{uim})(0/1)\) , 但是我上午考试就MLE了,赶紧 ...

  5. 【题解】P1373 小a和uim之大逃离

    [题解]P1373 小a和uim之大逃离 考虑到可能会MLE,考虑状态压缩一下 由于只要得到他们的差就行了,所以直接少记录一维就好了 \(dp(i,j,r,1/0)\)表示在\(i,j\)点,当前ui ...

  6. 洛谷P1373 小a和uim之大逃离[背包DP]

    题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声.刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从天空中打落下来,只见前方出现了一个 ...

  7. 洛谷 P1373 小a和uim之大逃离 Label:dp 不会

    题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声.刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从天空中打落下来,只见前方出现了一个 ...

  8. P1373 小a和uim之大逃离 二维dp

    题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声.刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从天空中打落下来,只见前方出现了一个 ...

  9. 【luogu P1373 小a和uim之大逃离】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1373 想不出来状态 看了一眼题解状态明白了 dp[i][j][h][1/0] 表示在i,j点差值为h是小A还 ...

随机推荐

  1. Appium python自动化测试系列之页面滑动原理讲解(十)

    10.1.1 页面滑动原理分析 在页面滑动查找章节我们就讲了滑动的知识点,只是不知道大家是否有认真练习以及去理解,如果你认真练习.理解了那么我相信这一章节的东西不用看也能够完成,下面我们还是简单分析一 ...

  2. 2017web前端面试总结

    2017web前端面试总结 从今年3月份开始面试笔试找实习找校招到现在也半年多了,拿到了不少offer,也有了自己的一点心得体会,这里写出来分享一下,拙见勿喷. 注意一下,以下的观点仅代表我个人的体会 ...

  3. Oracle结合Mybatis实现取表中前10条数据

    之前一直使用mysql和informix数据库,查表中前10条数据十分简单: 最原始版本: select top * from student 当然,我们还可以写的复杂一点,比如外加一些查询条件? 比 ...

  4. dynamic_cast 转换示例

    dynamic_cast 转换示例 /* 带虚函数与不带虚函数转换的区别 dynamic_cast:必须要有虚函数才可以转换 dynamic_cast:只能处理转换指针或引用,不能转换对象 dynam ...

  5. ligerUI---ligerGrid中treegrid(表格树)的使用

    写在前面: 表格树是在普通ligerGrid的基础上,做了一点改变,使数据以表格树的形式显示出来,适用于有级别的数据比如菜单(有父菜单,父菜单下面有子菜单).表格树的显示有两种方法,可以根据自己的项目 ...

  6. PLSQL锁表之后改如何操作

    (1)查看哪个表被锁select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects ...

  7. Maven快速使用阿里云的代理maven仓库

    自从开源中国的maven仓库挂了之后就一直在用国外的仓库,慢得想要砸电脑的心都有了.如果你和我一样受够了国外maven仓库的龟速下载?快试试阿里云提供的maven仓库,从此不在浪费生命…… 仓库地址: ...

  8. [转载] 基于Dubbo的Hessian协议实现远程调用

    转载自http://shiyanjun.cn/archives/349.html Dubbo基于Hessian实现了自己Hessian协议,可以直接通过配置的Dubbo内置的其他协议,在服务消费方进行 ...

  9. web前端-----第一弹html

    HTML 初识 web服务本质 import socket def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s ...

  10. 用CRT查找内存泄漏

    引用原文地址 : https://msdn.microsoft.com/en-us/library/x98tx3cf.aspx 1. 在program中严格按下面顺序include #define _ ...