P1373 小a和uim之大逃离(DP)
(点击此处查看原题)
题意
中文题,题意看题面吧。
解题思路
注意到我们只能向右和下移动,由此想到开二维的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)的更多相关文章
- 洛谷P1373 小a和uim之大逃离 dp
正解:dp 解题报告: 传送门! 同样是看到列表发的题解就想着跟着做下dp的题目趴 然后发现还挺难的,,,反正我只大概想到怎么转移但是初始化什么的都不会TT 所以还是大概说下QAQ 首先可以想到设f[ ...
- [P1373]小a和uim之大逃离 (DP)
[题目链接] 模拟赛的时候的一道题 因为老师不小心把数据发下来了……我考试打表的 考完之后Orz xzjds 然后开始打正解 题意 大概就是两个人,走矩阵,两个人各加上走上的矩阵的数值,要求最终两个人 ...
- 洛古 P1373 小a和uim之大逃离
P1373 小a和uim之大逃离 题目提供者lzn 标签 动态规划 洛谷原创 难度 提高+/省选- 题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电 ...
- 洛谷 P1373 小a和uim之大逃离
2016-05-30 12:31:59 题目链接: P1373 小a和uim之大逃离 题目大意: 一个N*M的带权矩阵,以任意起点开始向右或者向下走,使得奇数步所得权值和与偶数步所得权值和关于K的余数 ...
- 洛谷P1373 小a和uim之大逃离
P1373 小a和uim之大逃离 题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声.刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从 ...
- 【题解】 P1373 小a和uim之大逃离
题解 P1373 小a和uim之大逃离 传送门 一道dp好题 乍看此题,感觉要这样设计: \(dp(x)(y)(mod_{a})(mod_{uim})(0/1)\) , 但是我上午考试就MLE了,赶紧 ...
- 【题解】P1373 小a和uim之大逃离
[题解]P1373 小a和uim之大逃离 考虑到可能会MLE,考虑状态压缩一下 由于只要得到他们的差就行了,所以直接少记录一维就好了 \(dp(i,j,r,1/0)\)表示在\(i,j\)点,当前ui ...
- luogu- P1373 小a和uim之大逃离 DP 四维,其中一维记录差值
P1373 小a和uim之大逃离: https://www.luogu.org/problemnew/show/P1373 题意: 在一个矩阵中,小A和小B轮流取数,小A可以从任意点先取,小B后取,最 ...
- 洛谷P1373 小a和uim之大逃离[背包DP]
题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声.刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从天空中打落下来,只见前方出现了一个 ...
- 洛谷 P1373 小a和uim之大逃离 Label:dp 不会
题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声.刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从天空中打落下来,只见前方出现了一个 ...
随机推荐
- Friend-Graph (HDU 6152)2017中国大学生程序设计竞赛 - 网络选拔赛
Problem Description It is well known that small groups are not conducive of the development of a tea ...
- element-ui练习使用总结
<el-row> <el-col class="borderRed" :span="24"> <div class="g ...
- 1-1RGB色彩模式
http://www.missyuan.com/thread-350716-1-1.html RGB色彩模式 CTRL+O 打开文件 双击{O->Open} F8/菜单-窗口-信息 调出 ...
- 5.使用Ribbon实现客户端侧负载均衡
Ribbon实现客户端侧负载均衡 5.1. Ribbon简介 Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法 ...
- 2018-2019-2 20165330《网络对抗技术》Exp9 Web安全基础
目录 基础问题 实验目的 实验内容 实验步骤 实验总结与体会 实验目的 本实践的目标理解常用网络攻击技术的基本原理. 返回目录 实验内容 WebGoat准备工作 SQL注入攻击 命令注入(Comman ...
- ubuntu 14.04 升级到18.04
http://www.360doc.com/content/18/0929/09/35082563_790606785.shtml
- hadoop用户和权限
当前Apache Hadoop认证(authentication)支持simple和kerberos,simple是默认的,其实是信任操作系统的认证结果(也就是直接使用操作系统的用户).kerbero ...
- [Java]字符串数组 与 字符串链表 之间的相互转化
代码: package com.hy; import java.util.Arrays; import java.util.Collections; import java.util.List; pu ...
- express使用ejs模板引擎渲染html文件
小场景小知识点. 在使用express过程中,按照官网教程,利用express生成器很容易初始化express项目模板. 那么初始化项目之后应该如何使用ejs作为模板引擎呢?如下 // 注释掉默认生成 ...
- linux centos6.5 环境下安装redis的过程
过程还是挺折磨人的!谢谢许正同学一直耐心给我指导,虽然他也很忙.废话不多说: 首先,确保linux虚拟机联网: vm虚拟机>设置>Network Adapter 设置>网络配置设置成 ...