题目链接:传送门

题目大意:

  一个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. install sz rz linux

    1◆ ready 2◆ controller component   Xshell 注册码:690313-111999-999313 Xftp 注册码:101210-450789-147200   3 ...

  2. sql group by max

    SELECT    * ,    REPLACE(TDFG.xdfd,'doc_111','') GBFROM    (        SELECT            *        FROM  ...

  3. js之DOM元素遍历

    对于元素间的空格,IE9之前的版本不会返回文本节点,而且他所有浏览器都会返回文本节点.这样就导致 使用childNodes和firstChild等属性时的行为不一致.从而有了Element Trave ...

  4. ssh免输入密码登录

    ssh免输入密码登录   ubuntu下生成ssh密钥参见.   https://confluence.atlassian.com/display/BITBUCKET/Use+the+SSH+prot ...

  5. learning ddr write leveling

  6. C# 爬虫DLL文件 学习网站

    http://blog.csdn.net/u013063099/article/details/73201649?locationNum=15&fps=1 http://www.cnblogs ...

  7. Player Settings 导出设置

    Player Settings is where you define various parameters (platform specific) for the final game that y ...

  8. Jdbc连接数据库基本步骤

    Jdbc连接数据库的基本步骤: package demo.jdbc; import java.sql.Connection; import java.sql.DriverManager; import ...

  9. day16-python常用的内置模块2

    logging模块的使用 一:日志是我们排查问题的关键利器,写好日志记录,当我们发生问题时,可以快速定位代码范围进行修改.Python有给我们开发者们提供好的日志模块,下面我们就来介绍一下loggin ...

  10. Qt简单项目--加法计算器(详细代码注释)

    Qt的简单案例--加法计算器(详细代码注释) 一.项目结构 二.项目代码 widget.h #ifndef WIDGET_H #define WIDGET_H //预编译指令, 为了避免头文件被重复包 ...