您的位置:首页 > 产品设计 > UI/UE

Calculate Maximum Value II -LintCode

2018-01-26 11:16 204 查看
Given a string of numbers, write a function to find the maximum value from the string, you can add a + or * sign between any two numbers,It’s different with Calculate Maximum Value, You can insert parentheses anywhere.

样例

Given str = 01231, return 12

(0 + 1 + 2) * (3 + 1) = 12 we get the maximum value 12

Given str = 891, return 80

As 8 * (9 + 1) = 80, so 80 is maximum.

思路:

构建数组res[][],res[i][j]表示从str[i]到str[j]的字符串,可以取得的最大值。

在不同步长的情况下,计算不同位置的值:对于01231

如先计算[0,1],[1,2],[2,3]… 再计算[0,1,2],[1,2,3]…

递归求解在位置为i,步长为path的情况下,由字符串可以取得的最大值,并将其赋值给res[i][i+path-1]。

#ifndef C741_H
#define C741_H
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class Solution {
public:
/**
* @param str: a string of numbers
* @return: the maximum value
*/
int maxValue(string &str) {
// write your code here
if (str.empty())
return 0;
int len = str.size();
vector<vector<int>> res(len, vector<int>(len, INT_MIN));//res[i][j]存放从str[i]到str[j]的最大值
for (int i = 0; i<len; ++i)//初始化res
res[i][i] = str[i] - '0';
//在不同步长不同位置的情况下计算res的值
for (int path = 2; path <= len; ++path)
{
for (int i = 0; i + path <= len;++i)
res[i][i + path - 1] = ComputeMax(i, path, res);
}
return res[0][len - 1];
}
//递归计算位置i,步长为path的情况下取得的最大值
int ComputeMax(int i,int path,vector<vector<int>> vec) {
int res = INT_MIN;
if (vec[i][i + path - 1] != INT_MIN)
return vec[i][i + path - 1];
for (int k = 1; k < path; ++k) {
int left = ComputeMax(i, k, vec);
int right = ComputeMax(i + k, path - k, vec);
res = maxVal(maxVal(left + right, left*right),res);
}
return res;
}
int maxVal(int a, int b)
{
return a > b ? a : b;
}
};
#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: