牛客2019 East Central North America 部分题解

2023-11-20 17:32

本文主要是介绍牛客2019 East Central North America 部分题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

牛客题目地址

E Just Passing Through

方法:用dp[i][j][k]表示在这个地点(包括自己)经过k个pass所经过的最小高度和。
首先用is_pass[i][j]来记录一个地方是不是pass,注意在判断pass的时候四周不能有-1,自己也不能为-1,训练时因为这个导致一直WA。

然后第一行和最后一行要单独处理,因为只有两个点能到达。

状态方程为:(伪代码)

if(location[i][j] is pass)
dp[i][j][k+1]=min{dp[i][j][k+1], dp[i+1][j-1][k]+h[i][j], dp[i][j-1][k]+h[i][j], dp[i-1][j-1][k]+h[i][j]}
else
dp[i][j][k]=min{dp[i][j][k], dp[i+1][j-1][k]+h[i][j], dp[i][j-1][k]+h[i][j], dp[i-1][j-1][k]+h[i][j]}

#include <iostream>
#include <string.h>
#define mem(a, n) memset(a, n, sizeof(a))
using namespace std;
long long inf=99999999;
int loc[505][505];//表示该点高度
int is_pass[505][505];//记录该点是否为pass
long long dp[505][505][12]; //dp[i][j][k]表示第i行第j列经过k个pass的最小高度差和int main()
{int r, c, n;long long ans = inf;cin>>r>>c>>n;getchar();for (int i = 1; i <= r; i++){for (int j = 1; j <= c; j++){cin>>loc[i][j];}}mem(is_pass, 0);//dp初始化为无穷大for (int i = 0; i <=r+1 ; i++)for (int j = 0; j <=c+1; j++)for (int k = 0; k < 12; k++)dp[i][j][k] = inf;//最西边初始化for (int i = 1; i <=r; i++){if (loc[i][1] != -1){dp[i][1][0] = loc[i][1];}}//判断一个位置是不是passfor (int i = 2; i < r; i++){for (int j = 2; j < c; j++){//注意!!!!四周和自己不能是-1if(loc[i][j]==-1||loc[i][j-1]==-1||loc[i][j + 1]==-1||loc[i + 1][j]==-1||loc[i - 1][j]==-1) continue;int pass = loc[i][j];if (pass > loc[i][j-1] && pass > loc[i][j + 1] && pass < loc[i + 1][j] && pass < loc[i - 1][j]){is_pass[i][j] = 1;}}}//从左到右遍历for (int j = 2; j <= c; j++){int pass, jj = j - 1;//第一行,第一行和最后一行不存在passif (loc[1][j] != -1){//pass数量for (int k = 0; k < 11; k++){if (loc[1][jj] != -1)dp[1][j][k] = min(dp[1][j][k], dp[1][jj][k] + loc[1][j]);if (loc[2][jj] != -1)dp[1][j][k] = min(dp[1][j][k], dp[2][jj][k] + loc[1][j]);}}//中间其余行,只有中间行存在passfor (int i = 2; i < r; i++){if (loc[i][j] == -1) //此路不通continue;pass = is_pass[i][j]; //若这个地方是pass,计算dp是k+1,否则pass是0//左上,左中,左下for (int pos = -1; pos <= 1; pos++){if (loc[i + pos][jj] == -1)continue;for (int k = 0; k < 11; k++){dp[i][j][k + pass] = min(dp[i][j][k + pass], dp[i + pos][jj][k] + loc[i][j]);}}}//最后一行if (loc[r][j] != -1){for (int k = 0; k < 11; k++){if (loc[r - 1][jj] != -1)dp[r][j][k] = min(dp[r][j][k], dp[r - 1][jj][k] + loc[r][j]);if (loc[r][jj] != -1)dp[r][j][k] = min(dp[r][j][k], dp[r][jj][k] + loc[r][j]);}}}for (int i = 1; i <= r; i++){if (loc[i][c]!=-1 && dp[i][c][n] < ans)ans = dp[i][c][n];}if(ans!=inf) printf("%lld",ans);else printf("impossible");return 0;
}

这篇关于牛客2019 East Central North America 部分题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/396288

相关文章

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述