面试算法题
一个数组比如 1,2,3,-2,7;把其中任意两个相邻的数合并相加继续作为数组中的一个数,比如把2,3相加那么数组变为1,5,-2,7,问如果选择和并顺序使得结果最大,显然n个元素的数据通过n-1次合并可以得到最后的结果。最好有程序,
第一个正确答案得满分。
[最优解释]
//
// main.cpp
// acm
//
// Created by BossJue on 12-11-30.
// Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//
#include <iostream>
using std::endl;
using std::cout;
using std::cin;
int Search(int* array, unsigned uLen);
int main(int argc, const char * argv[])
{
// insert code here...
int array[]= {1,2,3,-1};
cout<<Search(array, 4)<<endl;
return 0;
}
int Search(int* array, unsigned uLen){
int** lpDpArray;
lpDpArray = new int*[uLen];
for (int iIndex= 0; iIndex< uLen; ++iIndex) {
lpDpArray[iIndex] = new int[uLen];
lpDpArray[iIndex][iIndex] = array[iIndex];
}
for(int iDistance= 1; iDistance< uLen; ++iDistance){
for(int iBegin= 0; iBegin+ iDistance< uLen; ++iBegin){
lpDpArray[iBegin][iBegin+ iDistance] = lpDpArray[iBegin][iBegin]+ lpDpArray[iBegin+1][iBegin+ iDistance];
for(int iPartion= iBegin+ 1; iPartion< iBegin+ iDistance; ++iPartion){
if(lpDpArray[iBegin][iBegin+ iDistance]< lpDpArray[iBegin][iPartion]+lpDpArray[iPartion+1][iBegin+ iDistance]){
lpDpArray[iBegin][iBegin+ iDistance]= lpDpArray[iBegin][iPartion]+lpDpArray[iPartion+1][iBegin+ iDistance];
}
}
}
}
int iMax= lpDpArray[0][uLen-1];
for(int iIndex= 0; iIndex< uLen; ++iIndex){
delete[] lpDpArray[iIndex];
}
delete [] lpDpArray;
return iMax;
}
#include <stdio.h>
void accumulate(int array[], int n){
// until中存储的是以i位置元素终止的最大值,f,t是起始和终止索引
// max mf mt记录正果序列以i位置元素终止的最大值,起始和终止索引
int max, until, f, t, mf,mt, i;
if(n < 1) return;
max = until = array[0];
mf = mt = f = t = 0;
for(i = 1; i < n; ++i){
if(until <= 0){
until = array[i];
f = t = i;
} else {
until = until + array[i];
t = i;
}
if(until > max){
max = until;
mf = f;
mt = t;
}
}
printf("max combine between %d and %d, value is %d", mf, mt, max);
}
int main(){
int array[] = {-1, -5, 8, -3, 6, -12, -2};
accumulate(array, sizeof(array)/sizeof(int));
return 0;
}
你以为20分很高?还全给?表述这么多次没一次清楚的,面试题你直接扫描啊!
[其他解释]
我没说高啊,说全给也没说错吧,既然是水题,分也不高,dp的给个状态转移方程总行吧!不要在那吐槽了。
[其他解释]
顶楼上。。。
[其他解释]
貌似值都用一样
[其他解释]
你等着,我回去给你写代码,我要分
[其他解释]
。。。还是没明白题
[其他解释]
怎么觉得按照题目,顺序没关系,也不会有最大结果呢,加法的交换律吗,怎么加都一样啊?
[其他解释]
非常感谢各位的回复!
[其他解释]
的确是19楼说的那道题,23楼基本上是正确答案了!
不过lpDpArray[iBegin][iBegin+ iDistance]= lpDpArray[iBegin][iPartion]+lpDpArray[iPartion+1][iBegin+ iDistance];这一句在分号前要加上sum(iBegin->iBegin+ iDistance),详见19楼链接。
结贴给分。
[其他解释]
不知道你说的什么
[其他解释]
可千万不要直接写程序,就算算出来也肯定不行。先用脑子想想,其实那是在替客户着想,这是题的意思。
好了,话不多说,赶快结贴,第一次回答问题,给分吧
[其他解释]
一个规划算法 呵呵
[其他解释]
问下楼主,贪心行不?每次合并的是当前最大的两个数,直到合并完成。
[其他解释]
优先级队列,也行吧
[其他解释]
这是一个动态规划的问题!
[其他解释]
null
[其他解释]
算法什么的对我来说,还是太难了!
[其他解释]