给定数组A,假设{5, 5, 4, 3, 7}
,在{*, /, + -}
上使用操作5, 5, 4, 3
,并将结果作为7
。如果可能,请打印答案。如果不是,return 0
。
Answer : 5 * 5 - 4 / 3 = 7
。
我使用递归,强力,检查所有情况来解决这个问题。
我的代码:
void check_result(int* arr, int size, char* op, int depth, int result, int val)
{
if(depth==size)
{
if(val==result)
{
// call function to print pattern of op[]
}
return ;
}
else
{
op[depth]='+';
check_result( arr+1, size, op, depth+1, result, val + *arr );
op[depth]='-';
check_result( arr+1, size, op, depth+1, result, val - *arr );
op[depth]='*';
check_result( arr+1, size, op, depth+1, result, val * (*arr) );
op[depth]='/';
if( *arr )
check_result( arr+1, size, op, depth+1, result, val / (*arr) );
}
}
你能否告诉我这个问题的动态方法,因为这需要O(4^n)
时间。
答案 0 :(得分:1)
州应该是DP[position][currentValue]
。这意味着如果您处于相应的position
且拥有currentValue
,则可以实现requiredResult。
boolean rec(int position, int currentValue)
{
if (position == lastPosition)
{
return currentValue == neededResult;
}
if (computed[position][currentValue]) return DP[position][currentValue];
boolean can = false;
int nextNumber = numbers[position + 1];
//Try every operation here and call rec again
can |= rec(position + 1, currentValue + nextNumber);
can |= rec(position + 1, currentValue - nextNumber);
can |= rec(position + 1, currentValue * nextNumber);
can |= rec(position + 1, currentValue / nextNumber);
DP[position][currentValue] = can;
computed[position][currentValue] = true;
return can;
}
然后,您可以使用其他方法恢复结果:
void restore(int position, int currentValue)
{
if (position == lastPosition) return;
if (DP[position + 1][currentValue + nextNumber])
{
cout << " + ";
restore(position + 1, currentValue + nextNumber);
}
else
if (DP[position + 1][currentValue - nextNumber])
{
cout << " - ";
restore(position + 1, currentValue - nextNumber);
}
else
if (DP[position + 1][currentValue * nextNumber])
{
cout << " * ";
restore(position + 1, currentValue * nextNumber);
}
else
if (DP[position + 1][currentValue / nextNumber])
{
cout << " / ";
restore(position + 1, currentValue / nextNumber);
}
}
P.S。这只是PSEUDOCODE。可能存在错误和错过的案例。