Php 如何优化此代码?

Php 如何优化此代码?,php,optimization,puzzle,Php,Optimization,Puzzle,我用PHP解决了下面的问题。 但是执行10位数字要花费太多时间。我想知道我哪里做错了? 我是动态规划新手。有人能看看这个吗 问题 在Byteland,他们有一个非常奇怪的货币体系 每枚比特兰金币上都写着一个整数。硬币 可以在银行兑换成三种硬币:n/2、n/3和n/4。 但这些数字都是四舍五入的(银行必须盈利) 你也可以用比特兰的硬币兑换美元。交易所 比率是1:1。但你买不到比特兰迪亚硬币 你有一枚金币。美元的最高限额是多少 你能得到它吗 =============================

我用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);
}