题目描述:
主要描述:
区间dp问题。
class Solution {
public:
vector<int> diffWaysToCompute(string expression) {
vector<int> ops;
for(int i=0;i<expression.length();++i)
{
if(expression[i]>='0'&&expression[i]<='9')
{
int num = 0;
while(i<expression.length()&&expression[i]>='0'&&expression[i]<='9')
num = num*10+expression[i++]-'0';
--i;
ops.push_back(num);
}
else
{
if(expression[i]=='+')
ops.push_back(-1);
else if(expression[i]=='-')
ops.push_back(-2);
else if(expression[i]=='*')
ops.push_back(-3);
}
}
// 开始区间dp
int n=ops.size();
vector<int> f[n][n];
for(int i=0;i<n;++i)
f[i][i] = {ops[i]};
for(int len=3;len<=n;len+=2)
{
for(int i=0;i<=n-len;++i)
{
int j=i+len-1;
for(int k=i+1;k<=j-1;++k)
{
if(ops[k]>=0)
continue;
auto l=f[i][k-1],r=f[k+1][j];
for(auto ll:l)
{
for(auto rr:r)
{
if(ops[k]==-1)
f[i][j].push_back(ll+rr);
else if(ops[k]==-2)
f[i][j].push_back(ll-rr);
else if(ops[k]==-3)
f[i][j].push_back(ll*rr);
}
}
}
}
}
return f[0][n-1];
}
};