楼主:
DJWS (...)
2016-12-14 08:46:26※ 引述《jakeasa123 (啊斑斑)》之铭言:
: 先前在Python板发了篇文,也获得了一些提示,但看了好几天也试做了几个版本,还是没能达到目标,于是来此询问。
: Python板原文:https://www.ptt.cc/bbs/Python/M.1480482142.A.713.html
1. 养不教,父之过。教不严,师之惰。
不必同情老师和同学。他们都有问题。
2. 原文的推文都在状况外。
3. 你的问题可以粗略分成程式问题、算法问题。
4. 程式问题就是语文问题,另含一点点数学问题。
程式语言变化少,只有for if array recursion,通常都有前例可循,其实不难。
由于你没有提供程式码,这里假设你没有程式方面的问题。
5. 算法问题就是数学问题。
数学问题最困难的地方,就是变化太多、往往没有前例可循。
比方说,在几何图形上画一条补助线,问题豁然开朗,根本莫名其妙。
即便背熟算法课本,遇到新的算法问题,通常还是解不开,不必自责。
6. 这一题的特色是:
(1) 分阶段:分成一天一天,每天做一件事。
(2) 有因果:今天的位置,决定了明天的位置(在九宫格内)。
(3) 可累积:今天的收益,以后列入总收益。
通常这种题型,可以用dynamic programming解决。
盘面拷贝数份,叠起来,变成三维。
一天换一个盘面,往上方走去。
程式码有:一个二维阵列(盘面),两个二维阵列(dp表格),四层循环(填表格)
7. 为什么我会知道那些特色呢?
书读多了、问题看多了,依照经验归纳出来的。
这些特色在不同地方有不同称呼:
例如算法课本里面的词汇是“optimal substructure”
例如竞赛选手所用的词汇是“无后效性”“状态转移”
那些特色已经形成了SOP了吗?
就我所知没有。只能自己看着办。
. 为什么我能联想到dp呢?
因为我曾经遇过类似题目,运气好。
8. 数学问题不只一种解法,这个问题也不只一种解法。
如果你想掌握各种解法:
(1) 靠别人:找一个懂的人,跟他交朋友。往后若有需要,靠交情、花钱请他帮忙。
(2) 靠自己:读懂各类算法课程、书籍、论文,情况许可就再念个phd。
9. 获得了“掌握各种解法”的实力之后,有什么用呢?
我看过的有:为兴趣、为面试、为逞英雄、为练脑力、为消遣。
每个人状况不一样,我没有办法评论。
10. 你们老师同学,也许都想到了这个份上。
可能他们已经获得了“掌握各种解法”的实力。
可能他们不想获得这种实力,因为没用处、因为关注其他实力、因为太弱、...。
因此他们各方评估后,决定简单教、随便学就好。
与其说他们都有问题,不如说他们都有心思。
作者:
cutekid (可爱小孩子)
2016-12-14 18:16:00推喔(Y)
作者:
FRAXIS (喔喔)
2016-12-15 07:06:00这问题有没有可能用 BFS 解决?如果最佳解有 self loop 应该是在最后一点而如果没有 self-loop 的话 应该可以忽略 cycle不知道对不对
楼主:
DJWS (...)
2016-12-15 08:10:00这个问题有一个性质: 正解按照地理座标排序仍是正解因为它的起点在中央,所以地理座标设定成中间小、外围大也许这个性质可以用来节省时间 不过我还没想出来还有就是,因为可以一直停留,根据贪心的原则,问题变成了:天数足够的话,赶快跑去附近的最大值,然后躺着赚天数不足的话,就留在起点附近的最大值,也是躺着赚当盘面只有一维的话 应该是可以线性时间解出来二维我就不清楚 交给ACM IOI选手想吧 他们脑筋比较好
这题可以设一个停止填表的中断点,就是已填表格数(天数)^^^对不起,好像不能确定,是我乱讲
枚举终点 把weight改成终点值-原值做最短路径 可以做到O(n^4 log n)不受天数影响 不过我不知道怎么做到更快
作者:
hcsoso (索索)
2016-12-18 14:45:00我想楼上的 n 指的是矩阵的边长? 题目中 n 为天数.不论如何, 这题不难做到线性时间, 一次 BFS 加上证明一些最佳解的性质就行了.噢, 漏了一步, 得先做一次 DP 计算不停留的最大利益.
作者:
hcsoso (索索)
2016-12-19 06:57:00请教 aaaaajack 的算法若碰到负圈怎么办? 有负边的图中最短路径 (simple path) 应是 NP-hard?啊, 可以先将所有负的位置移除, 最佳路径不使用他们
楼主:
DJWS (...)
2016-12-19 07:02:00楼上又在乱讲 负值形成"口 回"这类形状 路径势必要穿过去不能删除负值 也没办法"一齐加上足够大数值"解决这种情况况且根据原po给的盘面来看 应该是没有负值...
作者:
hcsoso (索索)
2016-12-19 07:07:00不是盘面上的负值, 而是 a 大算法中 终点值减原值可能为负D 大提到的情形不会发生在最佳路径上
楼主:
DJWS (...)
2016-12-19 07:23:00这样是我误会了 对不起
负值直接忽略 ,证得终点必为最大值 否则改停在最大值*路径上最大值
作者:
hcsoso (索索)
2016-12-19 07:57:00a大的算法可能有另外的问题。固定终点后也许有另一条获利较少的但较短的路径,在天数较少时也许才是最佳解。得计算 k 步内最短路径才行?最糟的情形多一个 n^2 项。也许用动态最短路径资料结构可以快一点,不过有点恶心…
楼主:
DJWS (...)
2016-12-19 08:25:00根据贪心原则,至多算n^2天,DP至多O(n^4),不必搞那么复杂
作者:
hcsoso (索索)
2016-12-19 08:42:00Good point.
你可能没看懂我意思 终点值-原值算的就是“亏多少”确实算n^2天即可 我本来是打算找找看有没有单调性可以利用 但情况似乎比我想的复杂总之就是 已知最后要去哪里赚 就挑亏最少的路径过去天数只影响要挑哪个终点
作者:
hcsoso (索索)
2016-12-19 10:27:00请问如何依照天数决定终点呢?假设我们固定一终点,按终点值调整各位置值为亏损,并将忽略负值位置。若这时最佳路径亏损10并花费10步,而有另一路径前往同一终点亏损100但花3步。当天数为三时如果只跑 Dijkstra 该点因最短路径花费10步因此不会被选取,除非算法纪录对每个点每个天数的最短亏损路径,但这就需要 k-Dijkstra 了。不知我是否误解了?
抱歉,你说的没错,确实有问题我误解你原先天数的疑虑是optimality但事实上feasibility就爆了Orz
楼主:
DJWS (...)
2016-12-19 17:06:00想要单调性的话...的确是有啦!盘面是一维的时候 类似于longest increasing subsequence每个地点都有一个适合的天数区间每当(地点座标,地点收益)变大、天数区间也随之变大预先计算每个地点的天数区间 之后可以暴搜/二分搜找答案盘面是二维的话 我就不清楚了
楼主:
DJWS (...)
2016-12-20 05:30:00二维的路也就那么几条 不如直接dp?
囧 二维simple path有无穷多条啊说错 指数多条现在问题不就是一维轻松线性 二维只能平方吗
楼主:
DJWS (...)
2016-12-20 22:02:00根据贪心原则,直达区域极值最赚,至多算n天,DP至多O(n^3)如果再引入单调性 我觉得是有机会再降一些啦修正一下,不是n天,是2n天
至多算n天就不对了就像hcsoso那篇做法的问题 直达不会是最赚的你可以设一些weight极小的格子强迫蛇行 达到n^2/2左右天数还是太难处理 或许DP O(n^4)真的是最佳解