<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Algoritmia básica (AB) &#187; programación dinámica</title>
	<atom:link href="http://webdiis.unizar.es/asignaturas/AB/?cat=28&#038;feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://webdiis.unizar.es/asignaturas/AB</link>
	<description>El reto de diseñar algoritmos eficientes para resolver problemas puede resultar apasionante</description>
	<lastBuildDate>Thu, 10 Feb 2022 08:44:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<item>
		<title>Programación dinámica: algoritmos de abajo arriba iterativos versus de arriba abajo con memorialización</title>
		<link>http://webdiis.unizar.es/asignaturas/AB/?p=2598</link>
		<comments>http://webdiis.unizar.es/asignaturas/AB/?p=2598#comments</comments>
		<pubDate>Thu, 25 Mar 2021 11:57:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[cosas de clase]]></category>
		<category><![CDATA[programación dinámica]]></category>

		<guid isPermaLink="false">http://webdiis.unizar.es/asignaturas/AB/?p=2598</guid>
		<description><![CDATA[&#160; Toda solución de programación dinámica evita usar una solución top-down recursiva que directamente traduzca a un algoritmo la ecuación recurrente correspondiente al problema. Esto es así porque, normalmente, el coste en tiempo de esa solución es extremadamente alto pues resuelve muchas veces los mismos subproblemas. Para evitar resolver muchas veces los mismos subproblemas, un algoritmo de [...]]]></description>
			<content:encoded><![CDATA[<p id="yui_3_17_2_1_1616671453949_944">&nbsp;</p>
<p>Toda solución de programación dinámica <strong id="yui_3_17_2_1_1616671453949_6185">evita usar una </strong><strong id="yui_3_17_2_1_1616671453949_6108">solución </strong><strong id="yui_3_17_2_1_1616671453949_1071"><em id="yui_3_17_2_1_1616671453949_1043">top-down</em> recursiva</strong> que directamente traduzca a un algoritmo la ecuación recurrente correspondiente al problema. Esto es así porque, normalmente, el coste en tiempo de esa solución es extremadamente alto pues <strong id="yui_3_17_2_1_1616671453949_3191">resuelve muchas veces los mismos subproblemas</strong>.</p>
<p id="yui_3_17_2_1_1616671453949_944">Para evitar resolver muchas veces los mismos subproblemas, un algoritmo de programación dinámica utiliza siempre una <strong id="yui_3_17_2_1_1616671453949_3331">tabla auxiliar</strong>, en la que se almacenan las <strong id="yui_3_17_2_1_1616671453949_3373">soluciones de los subproblemas</strong> conforme se van resolviendo.</p>
<p id="yui_3_17_2_1_1616671453949_944">Dicho esto, hay <strong id="yui_3_17_2_1_1616671453949_33033">dos formas distintas de implementar la solución de programación dinámica</strong>:</p>
<ul id="yui_3_17_2_1_1616671453949_4459">
<li id="yui_3_17_2_1_1616671453949_4458"><strong id="yui_3_17_2_1_1616671453949_6035">Solución de abajo arriba (<em id="yui_3_17_2_1_1616671453949_6282">bottom-up)</em> iterativa</strong>, en la que se van resolviendo <strong id="yui_3_17_2_1_1616671453949_11824">todos los subproblemas</strong> y <strong id="yui_3_17_2_1_1616671453949_45775">rellenando la tabla en un cierto orden, iterativamente</strong>, en primer lugar resolviendo los casos base de la recursión y después el resto de los casos aplicando la ecuación recurrente &#8220;ordenadamente&#8221;, de manera que cuando se necesiten las soluciones de ciertos subproblemas (en cierto sentido, &#8220;más pequeños&#8221;) para resolver otros, éstas hayan sido resueltas y almacenadas en la tabla con anterioridad en el(los) bucle(s) correspondiente(s) del algoritmo. Ejemplos de estas soluciones son las de los problemas de la mochila 0-1, el camino de coste mínimo en un grafo multietapa o la multiplicación de una secuencia de matrices, vistas ya en clase.</li>
<li id="yui_3_17_2_1_1616671453949_4458"><strong id="yui_3_17_2_1_1616671453949_20826">Solución (recursiva) de arriba abajo (<em id="yui_3_17_2_1_1616671453949_20946">top-down</em>) con memorialización (<em id="yui_3_17_2_1_1616671453949_21052">memoization</em>)</strong>, en la que se aplica directamente la ecuación recurrente, como en la solución <em id="yui_3_17_2_1_1616671453949_24300">top-down</em> recursiva (mencionada antes y descartada por muy ineficiente), pero <strong id="yui_3_17_2_1_1616671453949_45974">cada vez que se resuelve un subproblema, se almacena su solución en la tabla auxiliar para evitar volver a resolverlo de nuevo más adelante</strong>. De esta forma, lo primero que hace el algoritmo es averiguar si el subproblema ha sido ya resuelto consultando la tabla, y sólo si no se ha resuelto todavía, se aplica la ecuación recurrente para resolverlo (de forma recursiva). Un ejemplo de este tipo de solución es la del problema del viajante de comercio, vista ya en clase.</li>
</ul>
<p>El <strong id="yui_3_17_2_1_1616671453949_46163">coste asintótico</strong> de ambos métodos suele ser el mismo, salvo en algunos casos (poco frecuentes) en los que la solución de arriba abajo no necesita resolver todos los subproblemas de la tabla. En general, la solución de abajo arriba ofrece mejores resultados prácticos al tener constantes multiplicativas más pequeñas, pues se evita el sobrecoste provocado por las llamadas recursivas. Por eso recomendamos, siempre que sea posible, plantear una solución de abajo arriba iterativa.</p>
<p id="yui_3_17_2_1_1616671453949_944"><strong id="yui_3_17_2_1_1616671453949_52858">Lectura adicional (acceso restringido):</strong> <a id="yui_3_17_2_1_1616671453949_56748" href="http://webdiis.unizar.es/asignaturas/AB/restringido/rod_cutting_Cormen_et_al.pdf">ejemplo del recorte óptimo de varillas y sus dos soluciones de programación dinámica</a> (arriba abajo con memorialización versus abajo arriba iterativa), del libro [CLRS09].</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://webdiis.unizar.es/asignaturas/AB/?feed=rss2&#038;p=2598</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hoja de problemas de programación dinámica</title>
		<link>http://webdiis.unizar.es/asignaturas/AB/?p=2497</link>
		<comments>http://webdiis.unizar.es/asignaturas/AB/?p=2497#comments</comments>
		<pubDate>Wed, 18 Mar 2020 18:00:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Anuncios]]></category>
		<category><![CDATA[Problemas]]></category>
		<category><![CDATA[programación dinámica]]></category>

		<guid isPermaLink="false">http://webdiis.unizar.es/asignaturas/AB/?p=2497</guid>
		<description><![CDATA[Se ha publicado en la web (sección problemas) una hoja de problemas sobre algoritmos de programación dinámica (usuario y contraseña, los dados el primer día de clase). Son para trabajarlos en casa antes del 31 de marzo.]]></description>
			<content:encoded><![CDATA[<p>Se ha publicado en la web (sección problemas) una hoja de problemas sobre algoritmos de programación dinámica (usuario y contraseña, los dados el primer día de clase).</p>
<p><strong>Son para trabajarlos en casa antes del 31 de marzo.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://webdiis.unizar.es/asignaturas/AB/?feed=rss2&#038;p=2497</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prog. dinámica en entrevistas de trabajo</title>
		<link>http://webdiis.unizar.es/asignaturas/AB/?p=2420</link>
		<comments>http://webdiis.unizar.es/asignaturas/AB/?p=2420#comments</comments>
		<pubDate>Wed, 27 Mar 2019 12:10:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[curiosidades]]></category>
		<category><![CDATA[Empleo]]></category>
		<category><![CDATA[Problemas]]></category>
		<category><![CDATA[programación dinámica]]></category>

		<guid isPermaLink="false">http://webdiis.unizar.es/asignaturas/AB/?p=2420</guid>
		<description><![CDATA[. No es extraño que en entrevistas de trabajo relacionadas con la Computación aparezcan problemas resolubles mediante programación dinámica. Aquí hay algunos de ellos: What are the top 10 most popular dynamic programming problems among interviewers? &#160;]]></description>
			<content:encoded><![CDATA[<p style="text-align: right;"><span style="color: #ffffff;">.</span></p>
<p>No es extraño que en entrevistas de trabajo relacionadas con la Computación aparezcan problemas resolubles mediante programación dinámica.</p>
<p>Aquí hay algunos de ellos:</p>
<blockquote><p><em><a href="https://www.quora.com/What-are-the-top-10-most-popular-dynamic-programming-problems-among-interviewers">What are the top 10 most popular dynamic programming problems among interviewers?</a></em></p></blockquote>
<p>&nbsp;</p>
<p><a rel="attachment wp-att-1924" href="http://webdiis.unizar.es/asignaturas/AB/?attachment_id=1924"><img class="aligncenter size-medium wp-image-1924" title="interview" src="http://webdiis.unizar.es/asignaturas/AB/wp/wp-content/uploads/interview-300x168.jpg" alt="" width="300" height="168" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://webdiis.unizar.es/asignaturas/AB/?feed=rss2&#038;p=2420</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programación dinámica: aplicaciones</title>
		<link>http://webdiis.unizar.es/asignaturas/AB/?p=2415</link>
		<comments>http://webdiis.unizar.es/asignaturas/AB/?p=2415#comments</comments>
		<pubDate>Wed, 27 Mar 2019 12:07:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Bioinformática]]></category>
		<category><![CDATA[juegos]]></category>
		<category><![CDATA[programación dinámica]]></category>
		<category><![CDATA[robótica]]></category>
		<category><![CDATA[visión por computador]]></category>

		<guid isPermaLink="false">http://webdiis.unizar.es/asignaturas/AB/?p=2415</guid>
		<description><![CDATA[. Las soluciones de programación dinámica aparecen en prácticamente todos los dominios de aplicación. Seleccionamos aquí algunos ejemplos en Visión, Juegos, Robótica y Bioinformática: Dynamic Programming and Graph Algorithms in Computer Vision: A Survey. Dynamic programming and board games: A survey (acceso restringido con usurio/clave). Some dynamic programming problems useful to solve the mobile robot [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: right;"><span style="color: #ffffff;">.</span></p>
<p>Las soluciones de programación dinámica aparecen en prácticamente todos los dominios de aplicación. Seleccionamos aquí algunos ejemplos en Visión, Juegos, Robótica y Bioinformática:</p>
<ol>
<li><a href="http://www.cs.cornell.edu/~rdz/Papers/FZ-survey.pdf">Dynamic Programming and Graph Algorithms in Computer Vision: A Survey</a>.</li>
<li><a href="http://webdiis.unizar.es/asignaturas/AB/restringido/Dynamic%20programming%20and%20board%20games.pdf">Dynamic programming and board games: A survey (acceso restringido con usurio/clave)</a>.</li>
<li><a href="http://webdiis.unizar.es/CRPetri/papers/jcampos/04_GBC_IROS.pdf">Some dynamic programming problems useful to solve the mobile robot localization problem</a>.</li>
<li><a href="http://bibiserv.techfak.uni-bielefeld.de/dynprog/">Systematic Dynamic Programming in Bioinformatics</a>.</li>
</ol>
<p style="text-align: center;"><a rel="attachment wp-att-1913" href="http://webdiis.unizar.es/asignaturas/AB/?attachment_id=1913"><img class="aligncenter size-full wp-image-1913" title="dynamic" src="http://webdiis.unizar.es/asignaturas/AB/wp/wp-content/uploads/dynamic.png" alt="" width="477" height="611" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://webdiis.unizar.es/asignaturas/AB/?feed=rss2&#038;p=2415</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Problemas de programación dinámica</title>
		<link>http://webdiis.unizar.es/asignaturas/AB/?p=2395</link>
		<comments>http://webdiis.unizar.es/asignaturas/AB/?p=2395#comments</comments>
		<pubDate>Thu, 21 Mar 2019 11:10:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Anuncios]]></category>
		<category><![CDATA[Problemas]]></category>
		<category><![CDATA[programación dinámica]]></category>

		<guid isPermaLink="false">http://webdiis.unizar.es/asignaturas/AB/?p=2395</guid>
		<description><![CDATA[&#160; Se ha publicado en la web (sección problemas) una hoja de problemas sobre algoritmos de programación dinámica (usuario y contraseña, los dados el primer día de clase).]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>Se ha publicado en la web (<a href="http://webdiis.unizar.es/asignaturas/AB/?page_id=1617">sección problemas</a>) una hoja de problemas sobre algoritmos de programación dinámica (usuario y contraseña, los dados el primer día de clase).</p>
<p><a rel="attachment wp-att-2396" href="http://webdiis.unizar.es/asignaturas/AB/?attachment_id=2396"><img class="alignnone size-full wp-image-2396" title="when-you-are-learning-about-dynamic-programming-modern-solutions-require-39682345" src="http://webdiis.unizar.es/asignaturas/AB/wp/wp-content/uploads/when-you-are-learning-about-dynamic-programming-modern-solutions-require-39682345.png" alt="" width="500" height="529" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://webdiis.unizar.es/asignaturas/AB/?feed=rss2&#038;p=2395</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Publicada hoja de problemas de programación dinámica</title>
		<link>http://webdiis.unizar.es/asignaturas/AB/?p=2293</link>
		<comments>http://webdiis.unizar.es/asignaturas/AB/?p=2293#comments</comments>
		<pubDate>Wed, 11 Apr 2018 16:05:27 +0000</pubDate>
		<dc:creator>Javier Campos</dc:creator>
				<category><![CDATA[Anuncios]]></category>
		<category><![CDATA[Problemas]]></category>
		<category><![CDATA[programación dinámica]]></category>

		<guid isPermaLink="false">http://webdiis.unizar.es/asignaturas/AB/?p=2293</guid>
		<description><![CDATA[&#160; Se ha publicado una hoja de problemas sobre algoritmos de programación dinámica.]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>Se ha publicado una <a href="http://webdiis.unizar.es/asignaturas/AB/?page_id=1617">hoja de problemas</a> sobre algoritmos de programación dinámica.</p>
]]></content:encoded>
			<wfw:commentRss>http://webdiis.unizar.es/asignaturas/AB/?feed=rss2&#038;p=2293</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Floyd-Warshall: cálculo del camino</title>
		<link>http://webdiis.unizar.es/asignaturas/AB/?p=2197</link>
		<comments>http://webdiis.unizar.es/asignaturas/AB/?p=2197#comments</comments>
		<pubDate>Tue, 18 Apr 2017 10:46:38 +0000</pubDate>
		<dc:creator>Javier Campos</dc:creator>
				<category><![CDATA[cosas de clase]]></category>
		<category><![CDATA[programación dinámica]]></category>

		<guid isPermaLink="false">http://webdiis.unizar.es/asignaturas/AB/?p=2197</guid>
		<description><![CDATA[En la transparencia 55 de programación dinámica quedó como ejercicio el cálculo de los nodos de las secuencias que componen los caminos mínimos desde cualquier nodo i a cualquier nodo j. Hay varias formas de resolverlo. Una muy sencilla consiste en guardar una matriz adicional C[v,w] en la que se almacene un nodo u que [...]]]></description>
			<content:encoded><![CDATA[<p>En la <a href="http://webdiis.unizar.es/asignaturas/AB/material/4-Programacion%20dinamica.pdf">transparencia 55 de programación dinámica</a> quedó como ejercicio el cálculo de los nodos de las secuencias que componen los caminos mínimos desde cualquier nodo <em>i</em> a cualquier nodo <em>j</em>. Hay varias formas de resolverlo. Una muy sencilla consiste en guardar una matriz adicional <em>C</em>[<em>v</em>,<em>w</em>] en la que se almacene un nodo <em>u</em> que esté en el camino mínimo de <em>v</em> a <em>w</em>.  Para ello, en el interior de los tres bucles del algoritmo, hay que modificar la instrucción condicional añadiendo la actualización de esa matriz <em>C</em>:</p>
<pre>  <strong>si </strong>D[i,k]+D[k,j]&lt;D[i,j] <strong>entonces</strong>
    D[i,j]:=D[i,k]+D[k,j];
    C[i,j]:=k
<strong>  fsi</strong></pre>
<p>La matriz se ha debido inicializar al principio del algoritmo (por ejemplo con valores nulos).  El algoritmo para el cálculo del camino mínimo de <em>i</em> a <em>j</em>, usando la matriz <em>C</em>, queda como:</p>
<pre>  <strong>procedimiento </strong>camino(<strong>ent</strong> i,j:vértice;
<strong>                       ent</strong> C:<strong>vector</strong>[vértice,vértice] <strong>de</strong> entero)
  <strong>variable</strong> k:vértice
  <strong>principio</strong>
    k:=C[i,j];
    <strong>si</strong> k≠0 <strong>entonces</strong>
      camino(i,k,C);
      escribir(k);
      camino(k,j,C)
    <strong>fsi</strong>
<strong>  fin</strong></pre>
]]></content:encoded>
			<wfw:commentRss>http://webdiis.unizar.es/asignaturas/AB/?feed=rss2&#038;p=2197</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programación dinámica: aplicaciones</title>
		<link>http://webdiis.unizar.es/asignaturas/AB/?p=2181</link>
		<comments>http://webdiis.unizar.es/asignaturas/AB/?p=2181#comments</comments>
		<pubDate>Tue, 04 Apr 2017 08:10:52 +0000</pubDate>
		<dc:creator>Javier Campos</dc:creator>
				<category><![CDATA[Bioinformática]]></category>
		<category><![CDATA[cosas de clase]]></category>
		<category><![CDATA[juegos]]></category>
		<category><![CDATA[programación dinámica]]></category>
		<category><![CDATA[robótica]]></category>
		<category><![CDATA[visión por computador]]></category>

		<guid isPermaLink="false">http://webdiis.unizar.es/asignaturas/AB/?p=2181</guid>
		<description><![CDATA[. Las soluciones de programación dinámica aparecen en prácticamente todos los dominios de aplicación. Seleccionamos aquí algunos ejemplos en Visión, Juegos, Robótica y Bioinformática: Dynamic Programming and Graph Algorithms in Computer Vision: A Survey. Dynamic programming and board games: A survey (acceso restringido con usurio/clave). Some dynamic programming problems useful to solve the mobile robot [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: right;"><span style="color: #ffffff;">.</span></p>
<p>Las soluciones de programación dinámica aparecen en prácticamente todos los dominios de aplicación. Seleccionamos aquí algunos ejemplos en Visión, Juegos, Robótica y Bioinformática:</p>
<ol>
<li><a href="http://www.cs.cornell.edu/~rdz/Papers/FZ-survey.pdf">Dynamic Programming and Graph Algorithms in Computer Vision: A Survey</a>.</li>
<li><a href="http://webdiis.unizar.es/asignaturas/AB/restringido/Dynamic%20programming%20and%20board%20games.pdf">Dynamic programming and board games: A survey (acceso restringido con usurio/clave)</a>.</li>
<li><a href="http://webdiis.unizar.es/CRPetri/papers/jcampos/04_GBC_IROS.pdf">Some dynamic programming problems useful to solve the mobile robot localization problem</a>.</li>
<li><a href="http://bibiserv.techfak.uni-bielefeld.de/dynprog/">Systematic Dynamic Programming in Bioinformatics</a>.</li>
</ol>
<p style="text-align: center;"><a rel="attachment wp-att-1913" href="http://webdiis.unizar.es/asignaturas/AB/?attachment_id=1913"><img class="aligncenter size-full wp-image-1913" title="dynamic" src="http://webdiis.unizar.es/asignaturas/AB/wp/wp-content/uploads/dynamic.png" alt="" width="477" height="611" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://webdiis.unizar.es/asignaturas/AB/?feed=rss2&#038;p=2181</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fibonacci y programación dinámica</title>
		<link>http://webdiis.unizar.es/asignaturas/AB/?p=2141</link>
		<comments>http://webdiis.unizar.es/asignaturas/AB/?p=2141#comments</comments>
		<pubDate>Fri, 31 Mar 2017 11:02:18 +0000</pubDate>
		<dc:creator>Javier Campos</dc:creator>
				<category><![CDATA[cosas de clase]]></category>
		<category><![CDATA[Fibonacci]]></category>
		<category><![CDATA[programación dinámica]]></category>

		<guid isPermaLink="false">http://webdiis.unizar.es/asignaturas/AB/?p=2141</guid>
		<description><![CDATA[Uno de los ejemplos más sencillos (más que los vistos en clase) de aplicación de la programación dinámica es el cálculo del término n-ésimo de la sucesión de Fibonacci. La definición de la sucesión o función de Fibonacci es: Fib(n) = 1, si n = 0,1 Fib(n) = Fib(n-1) + Fib(n-2), si n &#62; 1 [...]]]></description>
			<content:encoded><![CDATA[<p>Uno de los ejemplos más sencillos (más que los vistos en clase) de aplicación de la programación dinámica es el cálculo del término <em>n</em>-ésimo de la sucesión de Fibonacci.</p>
<p>La definición de la sucesión o función de Fibonacci es:</p>
<p style="text-align: center;"><em>Fib</em>(<em>n</em>) = 1, si <em>n</em> = 0,1</p>
<p style="text-align: center;"><em>Fib</em>(<em>n</em>) = <em>Fib</em>(<em>n</em>-1) + <em>Fib</em>(<em>n</em>-2), si <em>n</em> &gt; 1</p>
<p>La solución más natural para calcular el término <em>n</em>-ésimo sería, por tanto, traducir esa definición recursiva de la función a nuestro pseudocódigo:</p>
<pre><strong>  función </strong>FibRec(n:natural) <strong>devuelve </strong>natural
<strong>  principio</strong>
    <strong>si </strong>n≤1 <strong>entonces</strong>
      <strong>devuelve </strong>1
    <strong>sino</strong>
      <strong>devuelve </strong>FibRec(n-1)+FibRec(n-2)
    <strong>fsi</strong>
<strong>  fin</strong></pre>
<p>El inconveniente de esa solución es su coste, exponencial en el valor de <em>n</em>. La ineficiencia de <em>FibRec</em> se debe a que se producen llamadas repetidas de la función para calcular valores que ya se habían calculado previamente, no se ha conservado su resultado, y por tanto hay que volver a calcularlos.</p>
<p>La solución de programación dinámica pasaría por utilizar una tabla auxiliar en la que almacenar las soluciones de todos los &#8220;subproblemas&#8221; (valores de <em>Fib</em> para valores menores que <em>n</em>) resueltos:</p>
<p style="text-align: center;"><a rel="attachment wp-att-2143" href="http://webdiis.unizar.es/asignaturas/AB/?attachment_id=2143"><img class="aligncenter size-full wp-image-2143" title="tabla" src="http://webdiis.unizar.es/asignaturas/AB/wp/wp-content/uploads/tabla1.jpg" alt="" width="272" height="28" /></a></p>
<p>El algoritmo iterativo para devolver el <em>n</em>-ésimo término de Fibonacci calculando la tabla sería:</p>
<pre>  <strong>función </strong>FibIterProto(n:natural) <strong>devuelve</strong> natural
<strong>  </strong><strong><strong>variables </strong></strong>i:natural; T:<strong>vector</strong>[0..n] <strong>de</strong> natural
<strong>  principio
</strong><strong>    si </strong>n≤1 <strong>entonces
</strong><strong>      devuelve</strong> 1
<strong>    sino
</strong>      T[0]:=1;
      T[1]:=1;
<strong>      para </strong>i:=2 <strong>hasta</strong> n <strong>hacer
</strong>        T[i]:=T[i-1]+T[i-2]
<strong>      fpara</strong>;
<strong>      devuelve</strong> T[n]
<strong>    fsi
</strong><strong>  fin </strong></pre>
<p>El último paso en la mejora proviene de detectar que en el algoritmo anterior no es necesario todo el vector auxiliar, pues basta con almacenar los dos últimos valores calculados:</p>
<pre>  <strong>función </strong>FibIter(n:natural) <strong>devuelve</strong> natural
<strong>  </strong><strong><strong>variables </strong></strong>i,suma,x,y:natural {x e y para almacenar los dos últimos
                 términos calculados y suma para almacenar el actual}
<strong>  principio
</strong><strong>    si </strong>n≤1 <strong>entonces
</strong><strong>      devuelve</strong> 1
<strong>    sino
</strong>      x:=1;
      y:=1;
<strong>      para </strong>i:=2 <strong>hasta</strong> n <strong>hacer
</strong>        suma:=x+y;
        y:=x;
        x:=suma
<strong>      fpara</strong>;
<strong>      devuelve</strong> suma
<strong>    fsi
</strong><strong>  fin </strong></pre>
]]></content:encoded>
			<wfw:commentRss>http://webdiis.unizar.es/asignaturas/AB/?feed=rss2&#038;p=2141</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Publicada hoja de problemas (prog. din.)</title>
		<link>http://webdiis.unizar.es/asignaturas/AB/?p=2132</link>
		<comments>http://webdiis.unizar.es/asignaturas/AB/?p=2132#comments</comments>
		<pubDate>Thu, 30 Mar 2017 09:46:36 +0000</pubDate>
		<dc:creator>Javier Campos</dc:creator>
				<category><![CDATA[Anuncios]]></category>
		<category><![CDATA[Problemas]]></category>
		<category><![CDATA[programación dinámica]]></category>

		<guid isPermaLink="false">http://webdiis.unizar.es/asignaturas/AB/?p=2132</guid>
		<description><![CDATA[Se ha publicado una hoja de problemas (algoritmos de programación dinámica).]]></description>
			<content:encoded><![CDATA[<p>Se ha <a href="http://webdiis.unizar.es/asignaturas/AB/?page_id=1617">publicado una hoja de problemas</a> (algoritmos de programación dinámica).</p>
<p style="text-align: center;"><a rel="attachment wp-att-1721" href="http://webdiis.unizar.es/asignaturas/AB/?attachment_id=1721"><img class="aligncenter size-full wp-image-1721" title="travelling_salesman_problem" src="http://webdiis.unizar.es/asignaturas/AB/wp/wp-content/uploads/travelling_salesman_problem.png" alt="" width="461" height="203" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://webdiis.unizar.es/asignaturas/AB/?feed=rss2&#038;p=2132</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
