CCPC-Wannafly Winter Camp Day1 (Div2) 吃豆豆 (DP)
题目描述
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)的更多相关文章
- 2020 CCPC Wannafly Winter Camp Day1 C. 染色图
2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...
- 2020 CCPC Wannafly Winter Camp Day1 Div.1& F
#include<bits/stdc++.h> #define forn(i, n) for (int i = 0; i < int(n); i++) #define fore(i, ...
- 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 ...
- CCPC Wannafly Winter Camp Div2 部分题解
Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果, ...
- CCPC-Wannafly Winter Camp Day1 (Div2 ABCFJ) 待补...
Day1 Div2 场外链接 按题目顺序~ A 机器人 传送门 题意:有两条平行直线A.B,每条直线上有n个点,编号为1~n.在同一直线上,从a站点到b站点耗时为两点间的距离.存在m个特殊站点,只有在 ...
- 2019 CCPC-Wannafly Winter Camp Day1 (Div2, onsite)
solve:4/11 补题:6/11 A 机器人 补题:zz 这是一道分类讨论的题目,有一个规律就是如果必须要从第一个区到第二个区,那么最多转区两次(1到2一次,2到1一次),然后分类讨论即可,只要细 ...
- 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)点都在起点左边 ...
- CCPC-Wannafly Winter Camp Day1 (Div2, onsite)
Replay Dup4: 要是不挂机,再多仔细想想就好了 J确实自闭好久,一直在想正确性,最后数据错了,喵喵喵? 还是要保证充足的休息啊,中间睡了一小会儿,也不知道睡了多久,醒来他们就又过了一道 要发 ...
- Comet OJ CCPC-Wannafly Winter Camp Day1 (Div2, online mirror) F.爬爬爬山-最短路(Dijkstra)(两个板子)+思维(mdzz...) zhixincode
爬爬爬山 已经提交 已经通过 9.83% Total Submission:417 Total Accepted:41 题目描述 爬山是wlswls最喜欢的活动之一. 在一个神奇的世界里,一共有nn座 ...
随机推荐
- nodejs 文件操作
前言: nodejs 自带的文件操作的模块 fs 就是对文件的增删查改: 就像我们用的服务器,我们没有办法在运行的文件上进行一直的修改,因为他不向浏览器,刷新后我们的文件会自己修改: 如果想要更改我 ...
- linux查看端口被那个进程占用
linux下遇到端口被暂用了 需要知道是哪个进程 比如80端口 可以这样 netstat -tunlp|
- 使用discriminator实现鉴别器
1在人员接口实现方法 public Employee getEmpByIdStep(Integer id); 2在映射文件进行配置 <!-- public Employee getEmpById ...
- orm练习题
表关系图 models.py from django.db import models # Create your models here. class Teacher(models.Model): ...
- JavaScript基础篇详解
全部的数据类型: 基本数据类型: undefined Number Boolean null String 复杂数据类型: object ①Undefined: >>>声明但未初始化 ...
- Jmeter之if控制器
在使用中,一些操作可以执行,需要满足一些特定的条件,这个时候就可以使用if控制器去控制. 一.界面显示 二.配置说明 1.名称:标识,建议设置为判断的功能 2.注释:说明 3.条件:是指需要满足那种条 ...
- 那些堪称神器的 Chrome 插件
Chrome 的简洁快速以及丰富的插件种类使得它在国内日益盛行,帮助了我们很多 Chrome 用户提升了工作效率,而今天要给大家推荐8款实用甚至堪称神器的 Chrome 插件,希望对提升大家的工作效率 ...
- 【VS开发】C++调用外部程序
关于三个SDK函数:WinExec, ShellExecute,CreateProcess的其他注意事项:[1]定义头文件必须定义以下两个头文件: [cpp] view plain copy #inc ...
- Xpath素材
from lxml import etree text = """ <div> <ul> <li class="item-0&qu ...
- Canvas入门01-基础知识
定义一个canvas,直接在Html中使用canvas便签即可. <!DOCTYPE html> <html lang="en"> <head> ...