题目大意

  地面上出现了一个n*m的巨幅矩阵,矩阵的每个格子上有一坨0~k不等量的魔液。怪物各给了小a和uim一个魔瓶,说道,你们可以从矩阵的任一个格子开始,每次向右或向下走一步,从任一个格子结束。开始时小a用魔瓶吸收地面上的魔液,下一步由uim吸收,如此交替下去,并且要求最后一步必须由uim吸收。魔瓶只有k的容量,也就是说,如果装了k+1那么魔瓶会被清空成零,如果装了k+2就只剩下1,依次类推。问使两个人内的魔瓶内的魔液一样多的走法有多少种。

题解

  我们很容易想到动规。用f(i, j, t, k, p)表示在位置(i, j),小a瓶子里有t个魔液,uim瓶子里有k个魔液,p表示当前轮到小a还是uim。一开始我想枚举每一个起始点然后动规,这样的时间复杂度是$O(n^2 m^2 k)$的,这种转移的过程让我在潜意识里认为这道题就应该用Bfs解决,以至于随后想到可以将所有出发点一起整时就是n*m个Bfs同时做,时间复杂度$O(n^2m^2)$。请你想想,这究竟是动规还是暴力呀?

  正确做法是:t和k可以转化为小a和uim瓶子里的液体的差d,这就降了一维;随后我们列出递归式来,根据递归式老老实实刷表即可。

  一些卡常数:要mod K,请(x + k) % k即可,不要(x % k + k) % k,这就慢了;同时,也不要为了取模单独写一个函数,函数调用费时间。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <ctime>
using namespace std; const int MAX_ROW = 810, MAX_COL = 810, MAX_K = 20;
const long long P = 1000000007;
int TotRow, TotCol, K;
int A[MAX_ROW][MAX_COL]; long long DP()
{
static int F[MAX_ROW][MAX_COL][MAX_K][2];
K++;
for (int row = 1; row <= TotRow; row++)
for (int col = 1; col <= TotCol; col++)
F[row][col][A[row][col]][0] = 1;
for (int row = 1; row <= TotRow; row++)
for (int col = 1; col <= TotCol; col++)
for (int t = 0; t < K; t++)
{
//当前是小a,下一个是uim
F[row + 1][col][(t - A[row + 1][col] + K) % K][1] += F[row][col][t][0];
F[row + 1][col][(t - A[row + 1][col] + K) % K][1] %= P;
F[row][col + 1][(t - A[row][col + 1] + K) % K][1] += F[row][col][t][0];
F[row][col + 1][(t - A[row][col + 1] + K) % K][1] %= P;
//当前是uim,下一个是小a
F[row + 1][col][(t + A[row + 1][col] + K) % K][0] += F[row][col][t][1];
F[row + 1][col][(t + A[row + 1][col] + K) % K][0] %= P;
F[row][col + 1][(t + A[row][col + 1] + K) % K][0] += F[row][col][t][1];
F[row][col + 1][(t + A[row][col + 1] + K) % K][0] %= P;
}
long long ans = 0;
for (int row = 1; row <= TotRow; row++)
for (int col = 1; col <= TotCol; col++)
ans = (ans + F[row][col][0][1]) % P;
return ans;
} int main()
{
scanf("%d%d%d", &TotRow, &TotCol, &K);
for (int i = 1; i <= TotRow; i++)
for (int j = 1; j <= TotCol; j++)
scanf("%d", &A[i][j]);
printf("%lld\n", DP());
return 0;
}

  

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

  1. [luogu1373]小a和uim之大逃离_动态规划

    小a和uim之大逃离 题目大意:有一个n*m的矩阵.每个格子上有一坨0~k不等量的权值.有两个人,每个人任选一个格子作为出发点,并只能向下或向右走.求最后两个人所得到的权值mod k相等的方案数. 注 ...

  2. [luogu1373]小a和uim之大逃离【动态规划】

    传送门:https://www.luogu.org/problemnew/show/P1373 定义状态是:\(f[i][j][h][0..1]\)表示在\([i,j]\)两个人相差为h,让某一个人走 ...

  3. luogu1373 小a和uim之大逃离 (dp)

    直接设f[i][j][k][l][2]是在(i,j)时两人分数是k,l,复杂度会爆掉 但其实只需要知道两人分数只差就行了 所以设f[i][j][k][2],k是分数之差%(K+1),最后一位表示该谁走 ...

  4. 【Luogu1373】小a和uim之大逃离(动态规划)

    [Luogu1373]小a和uim之大逃离(动态规划) 题面 题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声.刹那间,狂风大作,乌云布 ...

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

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

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

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

  7. 洛谷1373 小a和uim之大逃离

    洛谷1373 小a和uim之大逃离 本题地址:http://www.luogu.org/problem/show?pid=1373 题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北 ...

  8. AC日记——小A和uim之大逃离 II 洛谷七月月赛

    小A和uim之大逃离 II 思路: spfa: 代码: #include <bits/stdc++.h> using namespace std; #define INF 0x3f3f3f ...

  9. 【洛谷P1373】小a和uim之大逃离

    小a和uim之大逃离 题目链接 因为每次只能向下或向右走,我们可以递推 dp[i][j][d][0/1]表示走到(i,j),mod k 意义下差值为d,轮到小a/小uim操作时的方案数 dp[i][j ...

随机推荐

  1. 【RTTI】java Class类详解

    RTTI (Run-Time Type Information)运行时类信息 Java的Class类是java反射机制的基础,通过Class类我们可以获得关于一个类的相关信息,下面我们来了解一下有关j ...

  2. Android 检查手机上是否安装了指定的软件(根据包名检测)

    Android检查手机上是否安装了指定的软件(根据包名检测) /** * 检查手机上是否安装了指定的软件 * @param context * @param packageName * @return ...

  3. 升级Xcode或 MacOS编译iOS出现resource fork, Finder information, or similar detritus not allowed

    很久没有在网上留下足迹了,冒个泡吧 最近升级了Xcode,编译之前的一个项目是出现问题,问题结尾如下: resource fork, Finder information, or similar de ...

  4. JAVA趣味逻辑算法

    /**已知4位同学中的一位数学考了100分,当小李询问这4位是谁考了100分时,4个人的回答如下: A说:不是我. B说:是C C说:是D. D说:他胡说. 已知三个人说的是真话,一个人说的是假话.现 ...

  5. sublime之markdown快捷键

    目录 sublime 快捷键 markdown技能 sublime 快捷键 ctrl + shift + p 进入命令面板 package install 进入下载仓库 ctrl + alt + O ...

  6. Android中Adapter和Bridge模式理解和应用

    一 Adapter模式 意图: 将一个类的接口转换成客户希望的另外一个接口. Adapter模式使得原本由于接口不兼容而不能在一起工作的那些类可以在一起工作. 适用性: 使用一个已存在的类,而它的接口 ...

  7. iOS 9 中可用的受信任根证书列表

    iOS 受信任证书存储区包含随 iOS 预安装的可信根证书.  https://support.apple.com/zh-cn/HT205205 关于信任和证书 iOS 9 受信任证书存储区包含三类证 ...

  8. Python 之scrapy框架58同城招聘爬取案例

    一.项目目录结构: 代码如下: # -*- coding: utf-8 -*- # Define here the models for your scraped items # # See docu ...

  9. JavaScript ES 数组系列

    正文从这开始- ECMAScript 5.1 中提供的数组方法 其中部分方法,ECMAScript 3 就出现了,但是本文不再细分. ECMA-262/5.1 规范:https://www.ecma- ...

  10. profiler-gpu分析记录

    查看 Android 手机芯片信息下面以 夜神模拟器为例 D:\cmderλ adb devices # 1. 列出安卓设备List of devices attached127.0.0.1:6200 ...