(点击此处查看原题)

题意

中文题,题意看题面吧。

解题思路

注意到我们只能向右和下移动,由此想到开二维的dp数组dp[i][j],代表当前所在位置

我们需要让两人取数的差值为0,由于起点和走法的不同,在同一位置上差值可能不同,为此,dp数组再多开一个维度:dp[i][j][p],表示取完位置[i,j]的数后,二者的差值为p

我最开始想到的就是三维度的dp数组,不过写完后发现方程转移就不太灵活了,主要原因在于不知道当前位置是谁进行取数,因为这将影响p的转移

为了让p可以准确的转移,我们为dp数组再多开一个维度:dp[i][j][p][type] 表示在位置[i,j]处由type取数,使得两者的差值为p(type == 0 表示小a取数,type == 1 表示uim取数)

得到了可以转移的dp数组后,此时的状态转移方程就显然易见了:

/***********************/

k = k + 1; //差距为k+1的时候会抵消,此时为了节省代码量,先处理一下

状态转移方程
dp[i][j][p][0] += dp[i-1][j][(p - val[i][j] + k)%k][1];
dp[i][j][p][0] += dp[i][j-1][(p - val[i][j] + k)%k][1];
dp[i][j][p][1] += dp[i-1][j][(p + val[i][j])%k][0];
dp[i][j][p][1] += dp[i][j-1][(p + val[i][j])%k][0];

预处理
dp[i][j][val[i][j]][0] = 1;

计算出以每个点为终点得到的最大方案数之和
sum += dp[i][j][0][1]; (1 <= i <= n , 1 <= j <= m)

代码区

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<string>
#include<fstream>
#include<vector>
#include<stack>
#include <map>
#include <iomanip> #define bug cout << "**********" << endl
#define show(x, y) cout<<"["<<x<<","<<y<<"] "
#define LOCAL = 1;
using namespace std;
typedef long long ll;
const int inf = 1e9 + ;
const int mod = 1e9 + ;
const int Max = 1e6 + ; int n, m, k;
int val[][];
int dp[][][][]; //记录从(i,j)出发,这一位置的数由(0:小a,1:uim)取走情况下,两者之差为p的方案数
/*
* k = k + 1; //差距为k+1的时候会抵消,此时为了节省代码量,先处理一下
* dp[i][j][p][0] += dp[i-1][j][(p - val[i][j] + k)%k][1];
* dp[i][j][p][0] += dp[i][j-1][(p - val[i][j] + k)%k][1];
* dp[i][j][p][1] += dp[i-1][j][(p + val[i][j])%k][0];
* dp[i][j][p][1] += dp[i][j-1][(p + val[i][j])%k][0];
*
* 预处理
* dp[i][j][val[i][j]][0] = 1;
*
* 计算出以每个点为终点得到的最大方案数之和
* sum += dp[i][j][0][1]; (1 <= i <= n , 1 <= j <= m)
*/ int main()
{
#ifdef LOCAL
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
#endif
scanf("%d%d%d", &n, &m, &k);
k++;
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++)
scanf("%d", val[i] + j), dp[i][j][val[i][j] % k][] = ; int sum = ;
for (int i = ; i <= n; i++)
{
for (int j = ; j <= m; j++)
{
for (int p = ; p <= k; p++)
{
dp[i][j][p][] = (dp[i][j][p][] + dp[i - ][j][(p - val[i][j] + k) % k][]) % mod;
dp[i][j][p][] = (dp[i][j][p][] + dp[i][j - ][(p - val[i][j] + k) % k][]) % mod; dp[i][j][p][] = (dp[i][j][p][] + dp[i - ][j][(p + val[i][j]) % k][]) % mod;
dp[i][j][p][] = (dp[i][j][p][] + dp[i][j - ][(p + val[i][j]) % k][]) % mod;
}
sum = (sum + dp[i][j][][]) % mod;
}
}
printf("%d\n", sum);
return ;
}

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

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

    正解:dp 解题报告: 传送门! 同样是看到列表发的题解就想着跟着做下dp的题目趴 然后发现还挺难的,,,反正我只大概想到怎么转移但是初始化什么的都不会TT 所以还是大概说下QAQ 首先可以想到设f[ ...

  2. [P1373]小a和uim之大逃离 (DP)

    [题目链接] 模拟赛的时候的一道题 因为老师不小心把数据发下来了……我考试打表的 考完之后Orz xzjds 然后开始打正解 题意 大概就是两个人,走矩阵,两个人各加上走上的矩阵的数值,要求最终两个人 ...

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

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

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

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

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

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

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

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

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

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

  8. luogu- P1373 小a和uim之大逃离 DP 四维,其中一维记录差值

    P1373 小a和uim之大逃离: https://www.luogu.org/problemnew/show/P1373 题意: 在一个矩阵中,小A和小B轮流取数,小A可以从任意点先取,小B后取,最 ...

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

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

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

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

随机推荐

  1. PCIe/NVMe Soft Protocol Analyzer - 惊天发现

    最近在看一些协议方面的东西,刚刚接触很多东西不懂.为了尽快熟悉,打算搭建一套系统,包括上层主机和下层SSD. 既然是协议,那就需要硬啃spec.但是俺是懒人一个,想找个便捷方式快速熟悉.这就想到了协议 ...

  2. Python基础之range()

    range:指定范围,生成指定数字. 1. range() for i in range(1, 10): print(i) 执行结果为: 1 2 3 4 5 6 7 8 9 2. range()步长 ...

  3. springboot(七).springboot整合jedis实现redis缓存

    我们在使用springboot搭建微服务的时候,在很多时候还是需要redis的高速缓存来缓存一些数据,存储一些高频率访问的数据,如果直接使用redis的话又比较麻烦,在这里,我们使用jedis来实现r ...

  4. [JZOJ6345]:ZYB建围墙(数学+构造)

    题目描述 $ZYB$之国是特殊的六边形构造. 已知王国一共有$N$户家庭,每个家庭需占据一个不同的六边形格子. 王国里交流很频繁,所以这些家庭要构成一个连通区域:同时出于安全考虑,国王$ZYB$想在外 ...

  5. python并发——从线程池获取返回值

    并发是快速处理大量相似任务的绝佳办法,但对于有返回值的方法,需要一个容器专门来存储每个进程处理完的结果 from multiprocessing import Pool import time #返回 ...

  6. docker-compose部署微服务

    1.安装docker-compose curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose ...

  7. Leetcode题目141.环形链表(简单)

    题目描述: 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. 示例 ...

  8. 使用create-react-app创建项目(二)——引入ant方法(一)

    扩展项目(需要创建git默认文件) 具体步骤如下:       a.git init       b.git add .       c.git commit -m "..." n ...

  9. Nginx-HTTP之ngx_http_top_body_filter

    1. ngx_http_top_body_filter 该链表用于构造响应消息的响应正文. 大致有以下模块在该链表中插入了自己的函数: ngx_http_range_filter_module: ng ...

  10. 字符串暴力枚举子序列求LCS

    题意: 求n个串里的LCS,长度相同时按照字典序排序 solution: 断环为链,二进制枚举子序列,压入vector,按照字典序排序 把出现次数为n的,压入第二个vector 输出最长的第二个vec ...