题目链接:传送门

题目大意:

  一个N行M列的矩阵,从任意点开始往右或者往下走,每走一格获得所到达的格子的分数。

  要求总步数必须为偶数。问有多少种走法,使得奇数步得到的总分和偶数步得到的总分对K+1取模的值相等。

  1 ≤ N, M ≤ 800, 1 ≤ K ≤ 15;

思路:

状态:

  f[i][j][k]表示以(i,j)为终点时,奇数步与偶数步的差值为k时(当然k属于K+1的完全剩余系),的方案数。

初始状态:

  若从(i-1,j)或(i,j-1)走到(i,j)时产生的差值为k,则f[i][j][k]++。

  这是因为状态转移时只继承了之前的格子的状态,没有继承到之前没有格子的状态(第一步不用继承其他的状态)。

状态转移方程:

  f[i+1][j+1][k1] += f[i][j][k];其中k1 = k + 从(i, j)走到(i+1,j+1)时,产生的奇偶步差值。

  (PS:这里有→↓和↓→两种走法)

  f[i+2][j][k3] += f[i][j][k];其中k3 = k + 从(i, j)走到(i+2,j)时,产生的奇偶步差值。

  f[i][j+2][k4] += f[i][j][k];其中k4 = k + 从(i, j)走到(i,j+2)时,产生的奇偶步差值。

  当然以上的种种都要取模。

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int MAX_N = + ;
const int MOD = + ;
#define mod(x) (x)%MOD
#define modk(x) ((x)+K)%K
#define dep1 mat[i+1][j]-mat[i+1][j+1]
#define dep2 mat[i][j+1]-mat[i+1][j+1]
#define dep3 mat[i+1][j]-mat[i+2][j]
#define dep4 mat[i][j+1]-mat[i][j+2] int N, M, K;
int mat[MAX_N][MAX_N];
int f[MAX_N][MAX_N][]; void init()
{
for (int i = ; i <= N; i++) {
for (int j = ; j <= M; j++) {
if (i >= )
f[i][j][modk(mat[i-][j] - mat[i][j])]++;
if (j >= )
f[i][j][modk(mat[i][j-] - mat[i][j])]++;
}
}
} void dp()
{
init(); for (int i = ; i <= N; i++) {
for (int j = ; j <= M; j++) {
for (int k = ; k < K; k++) {
if (i+ <= N && j+ <= M) {
f[i+][j+][modk(k+dep1)] = mod(f[i+][j+][modk(k+dep1)] + f[i][j][k]);
}
if (i+ <= N && j+ <= M) {
f[i+][j+][modk(k+dep2)] = mod(f[i+][j+][modk(k+dep2)] + f[i][j][k]);
}
if (i+ <= N && j <= M) {
f[i+][j][modk(k+dep3)] = mod(f[i+][j][modk(k+dep3)] + f[i][j][k]);
}
if (i <= N && j+ <= M) {
f[i][j+][modk(k+dep4)] = mod(f[i][j+][modk(k+dep4)] + f[i][j][k]);
}
}
}
}
ll res = ;
for (int i = ; i <= N; i++)
for (int j = ; j <= M; j++)
res = mod(res + f[i][j][]);
// for (int i = 1; i <= N; i++) {
// for (int j = 1; j <= M; j++) {
// cout << f[i][j][0] << ' ';
// }
// cout << endl;
// }
cout << res << endl;
return;
} int main()
{
cin >> N >> M >> K;
K++;
for (int i = ; i <= N; i++)
for (int j = ; j <= M; j++) {
scanf("%d", &mat[i][j]);
mat[i][j] %= K;
}
dp();
return ;
}

P1373 小a和uim之大逃离(动态规划)的更多相关文章

  1. P1373 小a和uim之大逃离 (动态规划)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. P1373 小a和uim之大逃离

    转自:http://www.cnblogs.com/CtsNevermore/p/6028138.html 题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一 ...

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

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

随机推荐

  1. 消费Restful的web服务(三)

    构架工程 创建一个springboot工程,去消费RESTFUL的服务.这个服务是 http:///gturnquist-quoters.cfapps.io/api/random ,它会随机返回Jso ...

  2. Android--Android Studio 打开ADM报错

    Android studio无法打开类似与eclipse的DDMS, 在android studio里点击android device monitor(点击菜单栏里的Tools->Android ...

  3. Jquery源码探索

    封装原理 这里参考的jquery来进行封装的一个常用方法的一个库,可作为自己的一个库 原理:创建一个构造函数,将所有方法放在该构造函数原型里,访问$()方法时,返回这个构造函数的实例化,这样就简单的实 ...

  4. 架构之路:nginx与IIS服务器搭建集群实现负载均衡(三)

    参考网址:https://blog.csdn.net/zhanghan18333611647/article/details/50811980 [前言] 在<架构之路:nginx与IIS服务器搭 ...

  5. Java的Properties类使用

    一.Java Properties类 Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件,配置 ...

  6. CSS技巧-文字分散对齐的方法

    下面的代码可以在IE中实现文字分散对齐: <table width="300" align="center">    <tr>      ...

  7. commons-logging 与log4j的关系

    参考:http://zachary-guo.iteye.com/blog/361177

  8. 【原创】<笔试题> 深圳市天软科技开发有限公司

    时间:2018.03.03  上午 1.编写函数,实现字符串比较功能. 参考:http://blog.csdn.net/liubinzi123/article/details/8271683 /* * ...

  9. PHP socket以及http、socket、tcp、udp

    一.TCP/UDP/Socket TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为 ...

  10. js 循环遍历数组

    var a =[1,3,4]; a.each(functiom{ .... }) or for (var x in a ){ .... }