Php 如何优化此代码?
我用PHP解决了下面的问题。 但是执行10位数字要花费太多时间。我想知道我哪里做错了? 我是动态规划新手。有人能看看这个吗 问题 在Byteland,他们有一个非常奇怪的货币体系 每枚比特兰金币上都写着一个整数。硬币 可以在银行兑换成三种硬币:n/2、n/3和n/4。 但这些数字都是四舍五入的(银行必须盈利) 你也可以用比特兰的硬币兑换美元。交易所 比率是1:1。但你买不到比特兰迪亚硬币 你有一枚金币。美元的最高限额是多少 你能得到它吗 ========================================================Php 如何优化此代码?,php,optimization,puzzle,Php,Optimization,Puzzle,我用PHP解决了下面的问题。 但是执行10位数字要花费太多时间。我想知道我哪里做错了? 我是动态规划新手。有人能看看这个吗 问题 在Byteland,他们有一个非常奇怪的货币体系 每枚比特兰金币上都写着一个整数。硬币 可以在银行兑换成三种硬币:n/2、n/3和n/4。 但这些数字都是四舍五入的(银行必须盈利) 你也可以用比特兰的硬币兑换美元。交易所 比率是1:1。但你买不到比特兰迪亚硬币 你有一枚金币。美元的最高限额是多少 你能得到它吗 =============================
<?php
$maxA=array();
function exchange($money)
{
if($money == 0)
{
return $money;
}
if(isset($maxA[$money]))
{
$temp = $maxA[$money]; // gets the maximum dollars for N
}
else
{
$temp = 0;
}
if($temp == 0)
{
$m = $money/2;
$m = floor($m);
$o = $money/3;
$o = floor($o);
$n = $money/4;
$n = floor($n);
$total = $m+$n+$o;
if(isset($maxA[$m]))
{
$m = $maxA[$m];
}
else
{
$m = exchange($m);
}
if(isset($maxA[$n]))
{
$n = $maxA[$n];
}
else
{
$n = exchange($n);
}
if(isset($maxA[$o]))
{
$o = $maxA[$o];
}
else
{
$o = exchange($o);
}
$temp = max($total,$m+$n+$o,$money);
$maxA[$money]=$temp; //store the value
}
return $temp;
}
$A=array();
while(1)
{
$handle = fopen ("php://stdin","r");
$line = fgets($handle);
if(feof($handle))
{
break;
}
array_push($A,trim($line));
}
$count =count($A);
for($i=0;$i<$count;$i++)
{
$val = exchange($A[$i]);
print "$val \n";
}
?>
我仍然有这个问题的代码。但是它是C++的。这绝对不是最有效的,但它通过了。移植到php可能不太难
#include <cstdio>
#include <queue>
using namespace std;
unsigned long results;
queue to_test;
int main()
{
char tmp_val[30];
unsigned long coin_value = 1;
while (coin_value)
{
scanf("%s", tmp_val);
coin_value = 0;
results = 0;
for (int w = 0; tmp_val[w] != '\0'; w++)
{
coin_value *= 10;
coin_value += tmp_val[w] - 0x30;
}
if (coin_value != 0)
{
to_test.push(coin_value);
while(!to_test.empty())
{
unsigned long tester = to_test.front();
to_test.pop();
unsigned long over2 = tester/2;
unsigned long over3 = tester/3;
unsigned long over4 = tester/4;
if (tester < over2 + over3 + over4)
{
to_test.push(over2);
to_test.push(over3);
to_test.push(over4);
}
else
{
results += tester;
}
}
printf("%lu\n", results);
}
}
}
#包括
#包括
使用名称空间std;
无符号长结果;
排队测试;
int main()
{
char tmp_val[30];
无符号长币_值=1;
while(硬币价值)
{
scanf(“%s”,tmp_val);
硬币价值=0;
结果=0;
对于(int w=0;tmp_val[w]!='\0';w++)
{
硬币价值*=10;
硬币价值+=tmp值[w]-0x30;
}
如果(硬币价值!=0)
{
推送(硬币价值);
而(!to_test.empty())
{
无符号长测试仪=to_test.front();
to_test.pop();
无符号长超过2=测试仪/2;
无符号长超过3=测试仪/3;
无符号长超过4=测试仪/4;
如果(测试仪<超过2+超过3+超过4)
{
推压试验(超过2);
推压试验(超过3);
推压试验(超过4);
}
其他的
{
结果+=测试仪;
}
}
printf(“%lu\n”,结果);
}
}
}
这里是一个重新格式化的代码版本,供那些能够理解上述内容的人(如我)使用。这没有任何改善
请注意:(!feof($handle)){array_push($a,trim(fgets($handle));}(并在循环之前打开句柄)。(同样,您可以链接许多其他东西-
$m=floor($money/2);
,等等。)因为我看到您的缓存机制不起作用$maxA
在全局范围内定义,因此无法在函数范围内访问。您应该定义一个静态$maxA=array()代码>在函数的第一行。我仍然尝试使用static,但对于大于7位的数字,这会花费更多的时间。对不起,我尝试了static,结果成功了。谢谢你的回复。但我正在寻找一个使用动态规划的解决方案
function exchange($money) {
static $maxA = array(0 => 0);
if (isset($maxA[$money])) {
return $money;
}
$m = floor($money/2);
$o = floor($money/3);
$n = floor($money/4);
$total = $m+$n+$o;
if (isset($maxA[$m])) {
$m = $maxA[$m];
} else {
$m = exchange($m);
}
if (isset($maxA[$n])) {
$n = $maxA[$n];
} else {
$n = exchange($n);
}
if (isset($maxA[$o])) {
$o = $maxA[$o];
} else {
$o = exchange($o);
}
return $maxA[$money] = max($total, $m + $n + $o, $money);
}