博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CodeForces429B WorkingOut
阅读量:2343 次
发布时间:2019-05-10

本文共 1278 字,大约阅读时间需要 4 分钟。

使用动态规划求解,思想还是很简单的,lahub只能向右和向下,lahubina只能向右和向上,限制条件就是只能相遇一次。

分析一下就能知道除边界点外其他所有点都有可能成为相遇点,对相遇点进行分析,要使满足只相遇一次的条件,只能有以下两种情况:lahub向下走到相遇点并继续向下走,此时lahubina向右走到相遇点并继续向右走;另外一种情况就是lahub向右走到相遇点并继续向右走,lahubina向上走到相遇点并继续向上走。问题就解决了~

还有就是自己处理数组的时候一直喜欢下标从0开始计算,其实在很多时候,尤其是动规、贪心等算法里将数组的行列比实际大小都分大1或者2在求解的时候是能带来很大便利的,记住啦~

下面就是这道题的核心代码:

We can precalculate for dynamic programming matrixes and we're done.

dp1[i][j] = maximal cost of a path going from (1, 1) to (i, j) only down and right.

dp2[i][j] = maximal cost of a path from (i, j) to (1, m) going only up and right.

dp3[i][j] = maximal cost of a path from (m, 1) to (i, j) going only up and right.

dp4[i][j] = maximal cost of a path from (i, j) to (n, m) going only down or right.

And here is my full implementation of recurrences (C++ only):

for (int i = 1; i <= n; ++i)    for (int j = 1; j <= m; ++j)        dp1[i][j] = a[i][j] + max(dp1[i - 1][j], dp1[i][j - 1]);for (int j = m; j >= 1; --j)    for (int i = 1; i <= n; ++i)        dp2[i][j] = a[i][j] + max(dp2[i - 1][j], dp2[i][j + 1]);for (int i = n; i >= 1; --i)    for (int j = 1; j <= m; ++j)        dp3[i][j] = a[i][j] + max(dp3[i + 1][j], dp3[i][j - 1]);for (int i = n; i >= 1; --i)    for (int j = m; j >= 1; --j)        dp4[i][j] = a[i][j] + max(dp4[i][j + 1], dp4[i + 1][j]);

转载地址:http://iobvb.baihongyu.com/

你可能感兴趣的文章
Redis,API的理解和使用-全局命令
查看>>
shell之eval
查看>>
postgresql基本操作
查看>>
SQLAlchemy使用
查看>>
word设置标题
查看>>
git之HEAD
查看>>
基于2.6内核的Init_task进程之一
查看>>
C代码插入汇编
查看>>
C++基础知识-之强指针(韦东山视频学习)
查看>>
C++之Android弱指针
查看>>
C++基础知识之vector和[=] [&] [=,&]拷贝
查看>>
C语言常见错误
查看>>
Init中的next_token()函数
查看>>
STL之MAP和Vector
查看>>
智能指针 unique_ptr
查看>>
Init.rc配置文件Action字段解析
查看>>
uml问题解决
查看>>
cpu结构框图
查看>>
mmap内存映射和shmget共享内存
查看>>
c中int和long类型
查看>>