由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 做了一下Google的切木头
相关主题
How to find the size of an array? Thanks.Google面试怎么这么难啊,LG很难过,我该怎么劝他呢? (转载)
究竟什么定义了DP菜鸟求救 请大家看看我的代码有没有问题
C++问题看到一个c的面试题,求教。
heap里面delete一个非root的节点问一道题(2)
请教C/C++小C++ Q76: singly linked list -- 这个逆序打印有什么错?
一个C++的问题!问道题
C/C++里数组作函数的参数的话应该怎么写?两道F电面题
details 2nd smallest element in an array问个算法题
相关话题的讨论汇总
话题: int话题: nmin话题: reccost话题: nminindex话题: ncost
进入JobHunting版参与讨论
1 (共1页)
w****x
发帖数: 2483
1
//least cost to cut a batten
//the cost of cutting each segment is the cost of the segment length, an
array is storing each end point, eg:
// [0, 3, 7, 8, 11, 12], the batten length is 12, there are 4 cuting point
//No greedy solution to this problem
int getMinCost(int a[], int n)
{
if (NULL == a || n <= 1)
return -1;
int rec[100][100] = {0};

for (int i = 2; i < n; i++)
{
for (int j = 0; j < n-i; j++)
{
int nMin = INT_MAX;
for (int k = 1; k < i; k++)
nMin = min(nMin, rec[j][j+k] + rec[j+k][j+i] + a[j+i] - a[j]
);

rec[j][j+i] = nMin;
}
}
return rec[0][n-1];
}
代码不长, 很容易出错, 这几行code出了3个错
j*****y
发帖数: 1071
2
这是 clrs的一道习题 :)

【在 w****x 的大作中提到】
: //least cost to cut a batten
: //the cost of cutting each segment is the cost of the segment length, an
: array is storing each end point, eg:
: // [0, 3, 7, 8, 11, 12], the batten length is 12, there are 4 cuting point
: //No greedy solution to this problem
: int getMinCost(int a[], int n)
: {
: if (NULL == a || n <= 1)
: return -1;
: int rec[100][100] = {0};

w****x
发帖数: 2483
3
后来想了一下是不是可以用greedy算法来做,仔细分析了一下发现不可行,果然写了一
个不能得到最优解。
int _inner_greedy(int a[], int n)
{
if (n <= 2)
return 0;
int nMinIndex = 1;
for (int i = 1; i < n-1; i++)
{
if (abs((a[i] - a[0]) - (a[n-1] - a[i])) < abs((a[nMinIndex] - a[0])
- (a[n-1] - a[nMinIndex])))
nMinIndex = i;
}
return a[n-1] - a[0] + _inner_greedy(a, nMinIndex+1) + _inner_greedy(a+
nMinIndex, n-nMinIndex);
}
int getMinCostGreedy(int a[], int n)
{
if (NULL == a || n <= 1)
return -1;
_inner_greedy(a, n);
}
test case:
int a[] = {0, 1, 2, 3, 7, 8, 11, 12, 14, 19, 25, 26, 30, 38, 49};
cout< cout<
w****x
发帖数: 2483
4

是吗,看来想当Googler还是得看CLRS啊,我发现很多Google的题都是CLRS的,真TM麻


【在 j*****y 的大作中提到】
: 这是 clrs的一道习题 :)
p*****2
发帖数: 21240
5

为什么一定要进Google?

【在 w****x 的大作中提到】
:
: 是吗,看来想当Googler还是得看CLRS啊,我发现很多Google的题都是CLRS的,真TM麻
: 烦

w****x
发帖数: 2483
6
打印版本,真难做对:
int printMinCost(int a[], int n)
{
if (NULL == a || n <= 1)
return -1;
int recCost[100][100] = {0};
int recSplit[100][100] = {0};

for (int i = 2; i < n; i++)
{
for (int j = 0; j < n-i; j++)
{
int nMin = INT_MAX;
int nSplitIndex = 1;
for (int k = 1; k < i; k++)
{
int nCost = recCost[j][j+k] + recCost[j+k][j+i] + a[j+i] - a
[j];
if (nCost < nMin)
{
nMin = nCost;
nSplitIndex = j+k;
}
}

recCost[j][j+i] = nMin;
recSplit[j][j+i] = nSplitIndex;
}
}
stack> stk;
stk.push(std::make_pair(0, n-1));
while (!stk.empty())
{
int nLft = stk.top().first;
int nRgt = stk.top().second;
int nCost = recCost[nLft][nRgt];
int nSplit = recSplit[nLft][nRgt];
stk.pop();
if (nCost == 0)
continue;
cout< stk.push(make_pair(nSplit, nRgt));
stk.push(make_pair(nLft, nSplit));
}
return recCost[0][n-1];
}
w****x
发帖数: 2483
7
//least cost to cut a batten
//the cost of cutting each segment is the cost of the segment length, an
array is storing each end point, eg:
// [0, 3, 7, 8, 11, 12], the batten length is 12, there are 4 cuting point
//No greedy solution to this problem
int getMinCost(int a[], int n)
{
if (NULL == a || n <= 1)
return -1;
int rec[100][100] = {0};

for (int i = 2; i < n; i++)
{
for (int j = 0; j < n-i; j++)
{
int nMin = INT_MAX;
for (int k = 1; k < i; k++)
nMin = min(nMin, rec[j][j+k] + rec[j+k][j+i] + a[j+i] - a[j]
);

rec[j][j+i] = nMin;
}
}
return rec[0][n-1];
}
代码不长, 很容易出错, 这几行code出了3个错
j*****y
发帖数: 1071
8
这是 clrs的一道习题 :)

【在 w****x 的大作中提到】
: //least cost to cut a batten
: //the cost of cutting each segment is the cost of the segment length, an
: array is storing each end point, eg:
: // [0, 3, 7, 8, 11, 12], the batten length is 12, there are 4 cuting point
: //No greedy solution to this problem
: int getMinCost(int a[], int n)
: {
: if (NULL == a || n <= 1)
: return -1;
: int rec[100][100] = {0};

w****x
发帖数: 2483
9
后来想了一下是不是可以用greedy算法来做,仔细分析了一下发现不可行,果然写了一
个不能得到最优解。
int _inner_greedy(int a[], int n)
{
if (n <= 2)
return 0;
int nMinIndex = 1;
for (int i = 1; i < n-1; i++)
{
if (abs((a[i] - a[0]) - (a[n-1] - a[i])) < abs((a[nMinIndex] - a[0])
- (a[n-1] - a[nMinIndex])))
nMinIndex = i;
}
return a[n-1] - a[0] + _inner_greedy(a, nMinIndex+1) + _inner_greedy(a+
nMinIndex, n-nMinIndex);
}
int getMinCostGreedy(int a[], int n)
{
if (NULL == a || n <= 1)
return -1;
_inner_greedy(a, n);
}
test case:
int a[] = {0, 1, 2, 3, 7, 8, 11, 12, 14, 19, 25, 26, 30, 38, 49};
cout< cout<
w****x
发帖数: 2483
10

是吗,看来想当Googler还是得看CLRS啊,我发现很多Google的题都是CLRS的,真TM麻


【在 j*****y 的大作中提到】
: 这是 clrs的一道习题 :)
相关主题
一个C++的问题!Google面试怎么这么难啊,LG很难过,我该怎么劝他呢? (转载)
C/C++里数组作函数的参数的话应该怎么写?菜鸟求救 请大家看看我的代码有没有问题
details 2nd smallest element in an array看到一个c的面试题,求教。
进入JobHunting版参与讨论
p*****2
发帖数: 21240
11

为什么一定要进Google?

【在 w****x 的大作中提到】
:
: 是吗,看来想当Googler还是得看CLRS啊,我发现很多Google的题都是CLRS的,真TM麻
: 烦

w****x
发帖数: 2483
12
打印版本,真难做对:
int printMinCost(int a[], int n)
{
if (NULL == a || n <= 1)
return -1;
int recCost[100][100] = {0};
int recSplit[100][100] = {0};

for (int i = 2; i < n; i++)
{
for (int j = 0; j < n-i; j++)
{
int nMin = INT_MAX;
int nSplitIndex = 1;
for (int k = 1; k < i; k++)
{
int nCost = recCost[j][j+k] + recCost[j+k][j+i] + a[j+i] - a
[j];
if (nCost < nMin)
{
nMin = nCost;
nSplitIndex = j+k;
}
}

recCost[j][j+i] = nMin;
recSplit[j][j+i] = nSplitIndex;
}
}
stack> stk;
stk.push(std::make_pair(0, n-1));
while (!stk.empty())
{
int nLft = stk.top().first;
int nRgt = stk.top().second;
int nCost = recCost[nLft][nRgt];
int nSplit = recSplit[nLft][nRgt];
stk.pop();
if (nCost == 0)
continue;
cout< stk.push(make_pair(nSplit, nRgt));
stk.push(make_pair(nLft, nSplit));
}
return recCost[0][n-1];
}
l******e
发帖数: 20
13
没看都题目, 可以再详细解释一下题目要求吗?
要把batten cut 成什么样子?
还有rec[i][j] 代表什么?

【在 w****x 的大作中提到】
: //least cost to cut a batten
: //the cost of cutting each segment is the cost of the segment length, an
: array is storing each end point, eg:
: // [0, 3, 7, 8, 11, 12], the batten length is 12, there are 4 cuting point
: //No greedy solution to this problem
: int getMinCost(int a[], int n)
: {
: if (NULL == a || n <= 1)
: return -1;
: int rec[100][100] = {0};

z****e
发帖数: 54598
14
我是进来看签名的

【在 w****x 的大作中提到】
: //least cost to cut a batten
: //the cost of cutting each segment is the cost of the segment length, an
: array is storing each end point, eg:
: // [0, 3, 7, 8, 11, 12], the batten length is 12, there are 4 cuting point
: //No greedy solution to this problem
: int getMinCost(int a[], int n)
: {
: if (NULL == a || n <= 1)
: return -1;
: int rec[100][100] = {0};

y*c
发帖数: 904
15

章节是什么?谢谢

【在 j*****y 的大作中提到】
: 这是 clrs的一道习题 :)
x*********w
发帖数: 533
16
咳咳..
1 (共1页)
进入JobHunting版参与讨论
相关主题
问个算法题请教C/C++小
做了一下 Google 的 Best Time to Buy and Sell Stock II一个C++的问题!
问道题C/C++里数组作函数的参数的话应该怎么写?
2道算法题。 求教大家!details 2nd smallest element in an array
How to find the size of an array? Thanks.Google面试怎么这么难啊,LG很难过,我该怎么劝他呢? (转载)
究竟什么定义了DP菜鸟求救 请大家看看我的代码有没有问题
C++问题看到一个c的面试题,求教。
heap里面delete一个非root的节点问一道题(2)
相关话题的讨论汇总
话题: int话题: nmin话题: reccost话题: nminindex话题: ncost