题目链接:传送门

题目大意:

  一个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. 我个人对OOP的理解

    OOP面向对象的思维:pay1:封装 A.避免使用非法数据赋值 B.保证数据的完整性 C.避免类内部发生修改的时候,导致整个程序的修改 pay2:继承 A.继承模拟了现实世界的关系,OOP中强调一切皆 ...

  2. py 正在爬取第%d页的美眉图

    #coding=utf-8import reimport requestsfrom bs4 import BeautifulSoupnums = 1num = 1while True: url = & ...

  3. js地址多选实现,居住地,户口,职业,行业多选2

    需求是根据点击一个按钮 实现动态添加数据,所以每个数据都有一个地址多选, 以下是效果实现及部分关键代码,相关js相关文件在  http://www.cnblogs.com/zhan1995/p/848 ...

  4. rnnlib依赖ubuntu环境配置

    rnnlib help http://sourceforge.net/apps/mediawiki/rnnl/index.php?title=Main_Page boost: http://blog. ...

  5. linux下正则表达式学习

    下表包含了元字符的完整列表以及它们在正则表达式上下文中的行为: 字符 描述 \ 将下一个字符标记为一个特殊字符.或一个原义字符.或一个 向后引用.或一个八进制转义符.例如,'n' 匹配字符 " ...

  6. Linux电源管理-Linux regulator framework概述

    前言 1.  什么是regulator?      regulator翻译为"调节器",分为voltage regulator(电压调节器)和current(电流调节器).一般电源 ...

  7. Java 从服务器下载文件到本地(页面、后台、配置都有)

    先来看实现效果: 有一个链接如下: 点击链接下载文件:  第一种方法:Servlet实现 一.HTML页面部分: 1.HTML页面中的一个链接 <a id="downloadTempl ...

  8. lxml简单用法 解析网页

    import requests s=requests.Session() re=s.get(lgurl,headers=headers)  #此处s可以直接换成requests the_page=re ...

  9. 愛拼才會贏--IPA--闽南语

    闽南语经典曲目.

  10. [Leetcode 881]船救人 Boats to Save People 贪心

    [题目] The i-th person has weight people[i], and each boat can carry a maximum weight of limit. Each b ...