题目描述

wlswls在玩一个游戏。

wlswls有一个nn行mm列的棋盘,对于第ii行第jj列的格子,每过T[i][j]T[i][j]秒会在上面出现一个糖果,第一次糖果出现在第T[i][j]T[i][j]秒,糖果仅会在出现的那一秒存在,下一秒就会消失。

假如wlswls第kk秒在第ii行第jj列的格子上,满足T[i][j] | kT[i][j]∣k,则wlswls会得到一个糖果。

假如当前wlswls在第ii行第jj列的格子上,那么下一秒他可以选择往上下左右走一格或停在原地。

现在请问wlswls从指定的SS出发到达指定的TT,并且在路上得到至少CC个糖果最少需要多少时间?

wlswls在SS的初始时间为第00秒。

 
 

输入描述

第一行三个整数nn,mm,CC。

接下来nn行,每行m个整数T[i][j]T[i][j]。

接下来四个整数xsxs, ysys, xtxt, ytyt,其中(xs, ys)(xs,ys)表示SS,(xt, yt)(xt,yt)表示tt。

1 \leq n, m, T[i][j] \leq 101≤n,m,T[i][j]≤10

1 \leq C \leq 10181≤C≤1018

1 \leq xs, xt \leq n1≤xs,xt≤n

1 \leq ys, yt \leq m1≤ys,yt≤m

输出描述

一行一个整数表示答案。

样例输入 1

1 3 2
1 2 3
1 1 1 3

样例输出 1

3

思路:
定义状态 dp[i][j][t] 表示在t秒时 i,j位置最多可以获得的豆豆数量,
显然有以下的状态转移:
dp[i][j][t] = max(dp[i][j][t],dp[i-1][j][t-1]);
dp[i][j][t] = max(dp[i][j][t],dp[i][j-1][t-1]);
dp[i][j][t] = max(dp[i][j][t],dp[i+1][j][t-1]);
dp[i][j][t] = max(dp[i][j][t],dp[i][j+1][t-1]);
dp[i][j][t] = max(dp[i][j][t],dp[i][j][t-1]);
因为所求的是指定位置豆豆数量大于等于c的最小时间,
那么我们不妨放弃第三维度,多开一个拷贝数组来存上一秒的状态,每一次加一个时间来转移。
然后当指定位置豆豆数量大于等于c的时候
直接结束转移,输出当前的时间。 细节见代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define rt return
#define dll(x) scanf("%I64d",&x)
#define xll(x) printf("%I64d\n",x)
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define db(x) cout<<"== [ "<<x<<" ] =="<<endl;
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
ll powmod(ll a, ll b, ll MOD) {ll ans = ; while (b) {if (b % )ans = ans * a % MOD; a = a * a % MOD; b /= ;} return ans;}
inline void getInt(int* p);
const int maxn = ;
const int inf = 0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
int n, m;
int t[][];
int c;
int sx, sy, tx, ty;
int dp[][];
int b[][];
int main()
{
//freopen("D:\\common_text\\code_stream\\in.txt","r",stdin);
//freopen("D:\\common_text\\code_stream\\out.txt","w",stdout);
gbtb;
cin >> n >> m >> c;
repd(i, , n)
{
repd(j, , m)
{
cin >> t[i][j];
}
}
cin >> sx >> sy >> tx >> ty;
int step;
memset(dp, -, sizeof(dp));
dp[sx][sy] = ;
// cout << sx << " " << sy << endl;
for (step = ; ; step++)
{
repd(i, , n)
{
repd(j, , m)
{
b[i][j] = dp[i][j]; // 把上一秒的状态全部保存好
}
}
repd(i, , n)
{
repd(j, , m)
{
// 当前状态 dp[i][j] 可以从5个状态转变来,但是dp[i][j]->dp[i][j] 可以不写状态转移(没意义,原地加1会在后面处理)
if (i >= )
{
dp[i][j] = max(dp[i][j], b[i - ][j]);
}
if (i <= n - )
{
dp[i][j] = max(dp[i][j], b[i + ][j]);
}
if (j >= )
{
dp[i][j] = max(dp[i][j], b[i][j - ]);
}
if (j <= m - )
{
dp[i][j] = max(dp[i][j], b[i][j + ]);
}
if (step % t[i][j] == )
{
if (dp[i][j] >= ) // 可以到达,即 >=0 ,因为dp[sx][sy]=0
{
dp[i][j]++;
}
}
}
}
// repd(i, 1, n)
// {
// repd(j, 1, m)
// {
// cout << dp[i][j] << " ";
// }
// cout << endl;
// }
if (dp[tx][ty] >= c)
{
break;
} }
cout << step << endl; return ;
} inline void getInt(int* p) {
char ch;
do {
ch = getchar();
} while (ch == ' ' || ch == '\n');
if (ch == '-') {
*p = -(getchar() - '');
while ((ch = getchar()) >= '' && ch <= '') {
*p = *p * - ch + '';
}
}
else {
*p = ch - '';
while ((ch = getchar()) >= '' && ch <= '') {
*p = *p * + ch - '';
}
}
}

CCPC-Wannafly Winter Camp Day1 (Div2) 吃豆豆 (DP)的更多相关文章

  1. 2020 CCPC Wannafly Winter Camp Day1 C. 染色图

    2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...

  2. 2020 CCPC Wannafly Winter Camp Day1 Div.1&amp F

    #include<bits/stdc++.h> #define forn(i, n) for (int i = 0; i < int(n); i++) #define fore(i, ...

  3. 2020 CCPC Wannafly Winter Camp Day1 - I. K小数查询(分块)

    题目链接:K小数查询 题意:给你一个长度为$n$序列$A$,有$m$个操作,操作分为两种: 输入$x,y,c$,表示对$i\in[x,y] $,令$A_{i}=min(A_{i},c)$ 输入$x,y ...

  4. CCPC Wannafly Winter Camp Div2 部分题解

    Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果, ...

  5. CCPC-Wannafly Winter Camp Day1 (Div2 ABCFJ) 待补...

    Day1 Div2 场外链接 按题目顺序~ A 机器人 传送门 题意:有两条平行直线A.B,每条直线上有n个点,编号为1~n.在同一直线上,从a站点到b站点耗时为两点间的距离.存在m个特殊站点,只有在 ...

  6. 2019 CCPC-Wannafly Winter Camp Day1 (Div2, onsite)

    solve:4/11 补题:6/11 A 机器人 补题:zz 这是一道分类讨论的题目,有一个规律就是如果必须要从第一个区到第二个区,那么最多转区两次(1到2一次,2到1一次),然后分类讨论即可,只要细 ...

  7. CCPC-Wannafly Winter Camp Day1 (Div2, onsite) A B C E F I J

    A 机器人 链接:https://www.cometoj.com/contest/7/problem/A?problem_id=92 思路: 分两大类讨论: 1. B区没有点: (1)点都在起点左边 ...

  8. CCPC-Wannafly Winter Camp Day1 (Div2, onsite)

    Replay Dup4: 要是不挂机,再多仔细想想就好了 J确实自闭好久,一直在想正确性,最后数据错了,喵喵喵? 还是要保证充足的休息啊,中间睡了一小会儿,也不知道睡了多久,醒来他们就又过了一道 要发 ...

  9. Comet OJ CCPC-Wannafly Winter Camp Day1 (Div2, online mirror) F.爬爬爬山-最短路(Dijkstra)(两个板子)+思维(mdzz...) zhixincode

    爬爬爬山 已经提交 已经通过 9.83% Total Submission:417 Total Accepted:41 题目描述 爬山是wlswls最喜欢的活动之一. 在一个神奇的世界里,一共有nn座 ...

随机推荐

  1. (转)openssl 命令: openssl req 命令详解

                                      openssl req命令主要的功能有,生成证书请求文件, 查看验证证书请求文件,还有就是生成自签名证书.本文就主要记录一下open ...

  2. easyhook源码分析二——注入

    EasyHook 中的注入方法. 函数原型 // EasyHook 中的命名比较有意思,Rh 代表的就是Remote Hook,此函数就是远程钩子的一个子过程----注入,前面的宏代表它是导出函数. ...

  3. JVM参数配置详解-包含JDK1.8

    堆大小设置    JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制.32位系统下,一般限制在1.5G~2G:6 ...

  4. C# Setting.settings . 用法 2 使用配置文件(.settings、.config)存储应用程序配置

    引言 我不知大家早先是如何保存应用程序配置,以备下次打开时使用的,反正我开始学.Net的时候就去研究序列化,以二进制或XML格式的序列化来保存应用程序配置.这样每次都要建立单独的配置类,并书写读写配置 ...

  5. 阶段3 1.Mybatis_05.使用Mybatis完成CRUD_1 回顾Mybatis的环境搭建-实现查询所有功能

    先回顾Mybits的环境搭建,. 直接next 直接点击finish 创建好的项目. 所有东西都自己写不现实,约束文件的头部还是拷贝过来 导入依赖坐标,Mybits mysql的驱动 log4j 单元 ...

  6. SIRIM上海,http://www.sirim-global.com

    SIRIM上海 http://www.sirim-global.com

  7. itchat监听微信撤回消息

    import itchat from itchat.content import * import re msg_infomation = {} # 监听发送消息 @itchat.msg_regist ...

  8. 根据select的option文本选中对应的选项

    function selectByOptionTxt(obj,txt){ var optionArr = $(obj).find("option"); for(var i=0;i& ...

  9. typescript是否可以直接编译执行?

    算是个有趣的小问题,由于必须依赖node.js,typescript理论上是不能不转成js直接运行的.

  10. Y7000 安装ubuntu16.04.6 的tips :禁用nouveau 、Wifi 问题 、nvidia 驱动安装

    由于最近要跑DeepLearning 所以在自己的Y7000上装一个Ubuntu ,自己碰了好多壁 写下来以防止自己忘掉以便后续再用! 配置:i7-8750H +GeForce GTX 1050Ti ...