递归容易写,但是递归的深度容易受系统限制,如果没其他办法,只能改用栈来模拟递归
方法:通过保存变量入栈与出栈实现
如题:
排列小球
总提交:31 测试通过:9
描述
sub意外收到了一份礼物,是一大堆小球..准确地说,小球共有3种颜色:红黄白.sub决定从这些小球中选出n个来排成一列.如何使得这n个排成一排的小球看着顺眼,这是个问题..
对于连续放置的三个小球,sub都会定义一个”舒适度”.比如他认为三个颜色分别为红红黄的小球连在一起,舒适度为12.
而对于全部n个小球,会有n-2个连续的三个小球.这n-2个组合的舒适度之和,定义为整个序列的舒适度.现在sub想知道,整个序列的舒适度的最大值是多少.
三个小球总共有27种摆法,舒适度分别为:
红红红 4 红红白 12 红红黄 17
红白红 11 红白白 22 红白黄 24
红黄红 27 红黄白 37 红黄黄 30
白红红 6 白红白 18 白红黄 21
白白红 12 白白白 3 白白黄 16
白黄红 19 白黄白 22 白黄黄 24
黄红红 10 黄红白 13 黄红黄 7
黄白红 6 黄白白 3 黄白黄 4
黄黄红 7 黄黄白 15 黄黄黄 2
你可以认为,sub手里有无数小球,每个颜色都是.
突然天将画外音!Sub说,呃,这样的话万一暴力能做的话不久?了,于是乎,ben对Sub说:“你加一点东东不就行了么。”,“加什么?”Sub问道。
于是ben就大胆的改起了题目。
听好下面是ben对题目的赘述。
呃,ben说我有特殊能力,我能给你额外的合适度,你愿意要么?
你不会告诉我你说你不愿意要吧?那也太扯了!
然后ben就叽里咕噜了半天,大概意思就是,如果你在第i个位置放球j的话,ben会给你额外的合适度。
输入
一个整数,n(5<=n<=100000),表示序列的长度。
接下来有n行,每行三个数。第i行分别表示在第i个位置放红、白、黄时,ben给你的附加合适度。
其他输入不超过40
输出
一个整数,表示舒适度的最大值。
样例输入
3
2 3 4
3 4 2
1 2 1
样例输出
43
这题用DP来做的,递归写深度达到100000,会堆栈溢出,当然有其他更好的DP方法,下边说下递归转非递归。。。
原来DFS递归:
把原来的递归改成非递归: