diff options
Diffstat (limited to 'PlaygroundCpp')
| -rw-r--r-- | PlaygroundCpp/Sources/Playground.cpp | 150 | 
1 files changed, 94 insertions, 56 deletions
diff --git a/PlaygroundCpp/Sources/Playground.cpp b/PlaygroundCpp/Sources/Playground.cpp index 3083cdc..dd6d90b 100644 --- a/PlaygroundCpp/Sources/Playground.cpp +++ b/PlaygroundCpp/Sources/Playground.cpp @@ -1,77 +1,115 @@  #include <iostream>  #include <vector> +#include <climits> +#include <cassert>  //#include <gtest/gtest.h>  using std::vector; +using std::string; +using std::max; +using std::min; -vector<vector<int>> optimalWeight2DArray(int W, vector<int> &w2) { -	int j = w2.size(); -//	int value[W + 1][j + 1]; -	vector<vector<int> > value(W + 1, vector<int>(j + 1)); +long eval(long a, long b, char op) { +	if (op == '*') { +		return a * b; +	} else if (op == '+') { +		return a + b; +	} else if (op == '-') { +		return a - b; +	} else { +		assert(0); +	} +} -	for (int i = 0; i < j + 1; i++) { -		for (int w = 0; w < W + 1; w++) { -			if (i == 0 || w == 0) { -				value[w][i] = 0; -				continue; -			} -			value[w][i] = value[w][i - 1]; -			if (w2[i - 1] <= w) { -				int val = value[w - w2[i - 1]][i - 1] + w2[i - 1]; -				if (value[w][i] < val) { -					value[w][i] = val; -				} -			} -		} +vector<long> minAndMax(vector<vector<long>> &m, vector<vector<long>> &M, +		vector<char> &op, int i, int j) { +	long minValue = LONG_MAX; +	long maxValue = LONG_MIN; +	vector<long> result; +	for (int k = i; k < j; k++) { +		long a = eval(M[i][k], M[k + 1][j], op[k]); +		long b = eval(M[i][k], m[k + 1][j], op[k]); +		long c = eval(m[i][k], M[k + 1][j], op[k]); +		long d = eval(m[i][k], m[k + 1][j], op[k]); +		minValue = min(minValue, min(a, min(b, min(c, d)))); +		maxValue = max(maxValue, max(a, max(b, max(c, d))));  	} -	return value; +	result.push_back(minValue); +	result.push_back(maxValue); +	return result;  } - -int partition3(vector<int> &a) { -	if (a.size() < 3) -		return 0; -	int sum = 0; -	for (int i = 0; i < a.size(); i++) { -		sum = sum + a[i]; +long getMaxValue(vector<int> &d, vector<char> &op) { +	vector<vector<long>> m(d.size(), vector<long>(d.size())); +	vector<vector<long>> M(d.size(), vector<long>(d.size())); +	for (int i = 0; i < d.size(); i++) { +		m[i][i] = d[i]; +		M[i][i] = d[i];  	} -	if (sum % 3 != 0) -		return 0; -	int W = sum / 3; -	vector<vector<int> > values = optimalWeight2DArray(W, a); -	int count = 0; -	for (int i = 1; i < a.size() + 1; i++) { -		for (int w = 1; w < W + 1; w++) { -			if (values[w][i] == W) -				count = count + 1; +	for (int s = 0; s < op.size(); s++) { +		for (int i = 0; i < d.size() - s; i++) { +			int j = i + s + 1; +			if (j >= d.size()) +				break; +			vector<long> tempMinAndMax = minAndMax(m, M, op, i, j); +			m[i][j] = tempMinAndMax[0]; +			M[i][j] = tempMinAndMax[1];  		}  	} -	if (count >= 3) -		return 1; -	else -		return 0; +	return M[0][d.size() - 1]; +} + +long getMaxValue(string exp) { +	int x = exp.length(); +	vector<int> d; +	vector<char> op; + +	for (int i = 0; i < x - 1; i = i + 2) { +		d.push_back(exp[i] - '0'); +		op.push_back(exp[i + 1]); +	} +	d.push_back(exp[x - 1] - '0'); +	return getMaxValue(d, op);  } -//TEST(KnapsackPartition3, t1) { -//	vector<int> a = { 3, 3, 3, 3 }; -//	ASSERT_EQ(0, partition3(a)); + +//vector<int> parseExp(string exp) { +//	int x = exp.length(); +//	vector<int> d; +//	vector<char> op; +// +//	for (int i = 0; i < x - 1; i = i + 2) { +//		d.push_back(exp[i] - '0'); +//		op.push_back(exp[i + 1]); +//	} +//	d.push_back(exp[x - 1] - '0'); +//	return d; +////	return getMaxValue(d, op);  //}  // -//TEST(KnapsackPartition3, t2) { -//	vector<int> a = { 30 }; -//	ASSERT_EQ(0, partition3(a)); +//TEST(MaxExpValue, t1) { +//	string exp = "1+5"; +//	ASSERT_EQ(6, getMaxValue(exp));  //}  // -//TEST(KnapsackPartition3, t3) { -//	vector<int> a = { 1, 2, 3, 4, 5, 5, 7, 7, 8, 10, 12, 19, 25 }; -//	ASSERT_EQ(1, partition3(a)); +//TEST(MaxExpValue, t2) { +//	string exp = "5-8+7*4-8+9"; +//	ASSERT_EQ(200, getMaxValue(exp)); +//} +//TEST(MaxExpValue, t3) { +//	string exp = "1+2-3*4-5"; +//	ASSERT_EQ(6, getMaxValue(exp)); +//} +//TEST(MaxExpValue, t4) { +//	string exp = "1+2*3"; +//	ASSERT_EQ(9, getMaxValue(exp)); +//} +// +//TEST(ParseExpTest, t1) { +//	string exp = "1+5"; +//	ASSERT_EQ(1, parseExp(exp)[0]);  //} -  int main() { -	int n; -	std::cin >> n; -	vector<int> A(n); -	for (size_t i = 0; i < A.size(); ++i) { -		std::cin >> A[i]; -	} -	std::cout << partition3(A) << '\n'; +	string s; +	std::cin >> s; +	std::cout << getMaxValue(s) << '\n';  }  | 
