Re: [讨论] 面试遇到的考题

楼主: pika0923 (宜安)   2014-07-12 02:01:15
※ 引述《changyuheng (张昱珩)》之铭言:
: 加码一题:
: 给任一有限长度整数数列,
: 求以特定方法取出其中数字加总所能获得的极大值。
: 取法条件限制:
: 最多连续取 2 个数,亦即不得连续取 3 个数。
: 例:
: 2, 1, 9, 5, 2, 0, 1, 3, 4
: 可以下列方法取出数字:
: 1) 2, 1, 5, 2, 1, 3
: 2) 2, 1, 2, 0, 4
: 不可以下列方法取出数字:
: 1) 2, 1, 9, 2, 0, 3, 4
又是一题线性DP题 这次懒得写code了 直接弄算法 免得又要争那实作效率
假设题目输入的是a[1]~a[n]
初始化: b00[0], b01[0], b10[0], b11[0] 都设为0
b后面两个数代表前两项有没有取 而该数值为该状况下的最大值
因为题目只说整数(可能有负的) 所以b00保留
推广:
b00[i] = max of b00[i-1], b10[i-1]
b01[i] = max of b00[i-1]+a[i], b10[i-1]+a[i] 实际上就是b00[i]+a[i]
b10[i] = max of b01[i-1], b11[i-1]
b11[i] = b01[i-1]+a[i] 由于b11[i-1]+a[i]的状况会造成连续选三个 忽略之
答案:
ans = max of b00[n], b01[n], b10[n], b11[n]
每一层四个b数值都是可丢弃的
如果觉得开个阵列很浪费宝贵的空间
可以直接盖掉旧的
作者: lovdkkkk (dk)   2014-07-12 06:42:00
个人觉得前面与其说实做的效率, 更像说会不会有那种实做会不会有一堆判断式的部份

Links booklink

Contact Us: admin [ a t ] ucptt.com