//++
// File Name:
// TwoRobotsMaxProfit.cpp
//
// AUTHOR: Kenneth Hu
// VERSION STATUS: created @ Jan 23 2015
//
// Contents:
//--
#include <iostream>
#include <assert.h>
using namespace std;
#define MAX_MATRIX_WIDTH 6
#define MAX_MATRIX_HEIGHT 6
class Solution{
public:
int calculateMaxProfit(const unsigned int **matrix, int width, int height) {
assert(width <= MAX_MATRIX_WIDTH);
assert(height <= MAX_MATRIX_HEIGHT);
if (width == 0 || height == 0)
return 0;
mHeight = height; mWidth = width;
static unsigned int resultArr[MAX_MATRIX_HEIGHT*MAX_MATRIX_WIDTH][MAX_MATRIX_HEIGHT*MAX_MATRIX_WIDTH];
unsigned int nextStepMaxProfit = 0;
int nextRobot1Pos = 0, nextRobot2Pos = 0, x1 = 0, x2 = 0, y1 = 0, y2 = 0;
for (int robot1Pos = width * height - 1; robot1Pos >= 0; --robot1Pos) {
for (int robot2Pos = width * height - 1; robot2Pos >= 0; --robot2Pos){
translateToMatrixPos(robot1Pos, x1, y1);
translateToMatrixPos(robot2Pos, x2, y2);
if (robot1Pos == robot2Pos)
resultArr[robot1Pos][robot2Pos] = matrix[x1][y1];
else
resultArr[robot1Pos][robot2Pos] = matrix[x1][y1] + matrix[x2][y2];
nextStepMaxProfit = 0;
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 2; ++j) {
nextRobot1Pos = getNext(robot1Pos, i);
nextRobot2Pos = getNext(robot2Pos, j);
if (nextRobot1Pos >= 0 && nextRobot2Pos >= 0 && resultArr[nextRobot1Pos][nextRobot2Pos] > nextStepMaxProfit)
nextStepMaxProfit = resultArr[nextRobot1Pos][nextRobot2Pos];
}
}
resultArr[robot1Pos][robot2Pos] += nextStepMaxProfit;
}
}
return resultArr[0][0];
}
private:
int mHeight;
int mWidth;
int getNext(int curPos, bool goDown = true) {
int x =0, y = 0, nextPos = 0;
translateToMatrixPos(curPos, x, y);
if (goDown) {
if (x + 1 >= mHeight) return -1;
return (x + 1) * mWidth + y;
}
if (y + 1 >= mWidth) return -1;
return curPos + 1;
}
void translateToMatrixPos(int pos, int &x, int &y) {
x = pos / mWidth;
y = pos % mWidth;
}
};
int main() {
const unsigned int MATRIX_SIZE = 3;
const unsigned int r1[MATRIX_SIZE] = { 0, 0, 2 };
const unsigned int r2[MATRIX_SIZE] = { 0, 3, 2 };
const unsigned int r3[MATRIX_SIZE] = { 0, 1, 0 };
const unsigned int *matrix[MATRIX_SIZE] = { r1, r2, r3 };
Solution so;
cout << "Max Profit for two robots is " << so.calculateMaxProfit(matrix, MATRIX_SIZE, MATRIX_SIZE) << endl;
return 0;
}
Ly8rKwovLyBGaWxlIE5hbWU6Ci8vICAgICAgVHdvUm9ib3RzTWF4UHJvZml0LmNwcAovLwovLyBBVVRIT1I6IEtlbm5ldGggSHUKLy8gVkVSU0lPTiBTVEFUVVM6IGNyZWF0ZWQgQCBKYW4gMjMgMjAxNQovLwovLyBDb250ZW50czoKLy8tLQoKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIE1BWF9NQVRSSVhfV0lEVEggICAgICA2CiNkZWZpbmUgTUFYX01BVFJJWF9IRUlHSFQgICAgIDYKCmNsYXNzIFNvbHV0aW9uewpwdWJsaWM6CiAgICBpbnQgY2FsY3VsYXRlTWF4UHJvZml0KGNvbnN0IHVuc2lnbmVkIGludCAqKm1hdHJpeCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CiAgICAgICAgYXNzZXJ0KHdpZHRoIDw9IE1BWF9NQVRSSVhfV0lEVEgpOwogICAgICAgIGFzc2VydChoZWlnaHQgPD0gTUFYX01BVFJJWF9IRUlHSFQpOwogICAgICAgIGlmICh3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwKQogICAgICAgICAgICByZXR1cm4gMDsKCiAgICAgICAgbUhlaWdodCA9IGhlaWdodDsgIG1XaWR0aCA9IHdpZHRoOwogICAgICAgIHN0YXRpYyB1bnNpZ25lZCBpbnQgcmVzdWx0QXJyW01BWF9NQVRSSVhfSEVJR0hUKk1BWF9NQVRSSVhfV0lEVEhdW01BWF9NQVRSSVhfSEVJR0hUKk1BWF9NQVRSSVhfV0lEVEhdOwogICAgICAgIHVuc2lnbmVkIGludCBuZXh0U3RlcE1heFByb2ZpdCA9IDA7CiAgICAgICAgaW50IG5leHRSb2JvdDFQb3MgPSAwLCBuZXh0Um9ib3QyUG9zID0gMCwgeDEgPSAwLCB4MiA9IDAsIHkxID0gMCwgeTIgPSAwOwoKICAgICAgICBmb3IgKGludCByb2JvdDFQb3MgPSB3aWR0aCAqIGhlaWdodCAtIDE7IHJvYm90MVBvcyA+PSAwOyAtLXJvYm90MVBvcykgewogICAgICAgICAgICBmb3IgKGludCByb2JvdDJQb3MgPSB3aWR0aCAqIGhlaWdodCAtIDE7IHJvYm90MlBvcyA+PSAwOyAtLXJvYm90MlBvcyl7CiAgICAgICAgICAgICAgICB0cmFuc2xhdGVUb01hdHJpeFBvcyhyb2JvdDFQb3MsIHgxLCB5MSk7CiAgICAgICAgICAgICAgICB0cmFuc2xhdGVUb01hdHJpeFBvcyhyb2JvdDJQb3MsIHgyLCB5Mik7CiAgICAgICAgICAgICAgICBpZiAocm9ib3QxUG9zID09IHJvYm90MlBvcykKICAgICAgICAgICAgICAgICAgICByZXN1bHRBcnJbcm9ib3QxUG9zXVtyb2JvdDJQb3NdID0gbWF0cml4W3gxXVt5MV07CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0QXJyW3JvYm90MVBvc11bcm9ib3QyUG9zXSA9IG1hdHJpeFt4MV1beTFdICsgbWF0cml4W3gyXVt5Ml07CgogICAgICAgICAgICAgICAgbmV4dFN0ZXBNYXhQcm9maXQgPSAwOwogICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDI7ICsraikgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0Um9ib3QxUG9zID0gZ2V0TmV4dChyb2JvdDFQb3MsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0Um9ib3QyUG9zID0gZ2V0TmV4dChyb2JvdDJQb3MsIGopOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dFJvYm90MVBvcyA+PSAwICYmIG5leHRSb2JvdDJQb3MgPj0gMCAmJiByZXN1bHRBcnJbbmV4dFJvYm90MVBvc11bbmV4dFJvYm90MlBvc10gPiBuZXh0U3RlcE1heFByb2ZpdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRTdGVwTWF4UHJvZml0ID0gcmVzdWx0QXJyW25leHRSb2JvdDFQb3NdW25leHRSb2JvdDJQb3NdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXN1bHRBcnJbcm9ib3QxUG9zXVtyb2JvdDJQb3NdICs9IG5leHRTdGVwTWF4UHJvZml0OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVzdWx0QXJyWzBdWzBdOwogICAgfQoKcHJpdmF0ZToKICAgIGludCAgICBtSGVpZ2h0OwogICAgaW50ICAgIG1XaWR0aDsKICAgIAogICAgaW50ICAgIGdldE5leHQoaW50IGN1clBvcywgYm9vbCBnb0Rvd24gPSB0cnVlKSB7CiAgICAgICAgaW50IHggPTAsIHkgPSAwLCBuZXh0UG9zID0gMDsKICAgICAgICB0cmFuc2xhdGVUb01hdHJpeFBvcyhjdXJQb3MsIHgsIHkpOwogICAgICAgIGlmIChnb0Rvd24pIHsKICAgICAgICAgICAgaWYgKHggKyAxID49IG1IZWlnaHQpIHJldHVybiAtMTsKICAgICAgICAgICAgcmV0dXJuICh4ICsgMSkgKiBtV2lkdGggKyB5OwogICAgICAgIH0KICAgICAgICBpZiAoeSArIDEgPj0gbVdpZHRoKSByZXR1cm4gLTE7CiAgICAgICAgcmV0dXJuIGN1clBvcyArIDE7CiAgICB9CgogICAgdm9pZCB0cmFuc2xhdGVUb01hdHJpeFBvcyhpbnQgcG9zLCBpbnQgJngsIGludCAmeSkgewogICAgICAgIHggPSBwb3MgLyBtV2lkdGg7CiAgICAgICAgeSA9IHBvcyAlIG1XaWR0aDsKICAgIH0KfTsKCgppbnQgbWFpbigpIHsKICAgIGNvbnN0IHVuc2lnbmVkIGludCBNQVRSSVhfU0laRSA9IDM7CiAgICBjb25zdCB1bnNpZ25lZCBpbnQgcjFbTUFUUklYX1NJWkVdID0geyAwLCAwLCAyIH07CiAgICBjb25zdCB1bnNpZ25lZCBpbnQgcjJbTUFUUklYX1NJWkVdID0geyAwLCAzLCAyIH07CiAgICBjb25zdCB1bnNpZ25lZCBpbnQgcjNbTUFUUklYX1NJWkVdID0geyAwLCAxLCAwIH07CiAgICBjb25zdCB1bnNpZ25lZCBpbnQgKm1hdHJpeFtNQVRSSVhfU0laRV0gPSB7IHIxLCByMiwgcjMgfTsKICAgIFNvbHV0aW9uIHNvOwoKICAgIGNvdXQgPDwgIk1heCBQcm9maXQgZm9yIHR3byByb2JvdHMgaXMgIiA8PCBzby5jYWxjdWxhdGVNYXhQcm9maXQobWF0cml4LCBNQVRSSVhfU0laRSwgTUFUUklYX1NJWkUpIDw8IGVuZGw7CiAgICByZXR1cm4gMDsKfQ==