<?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>DPメニュー - IQパズルステップ</title>
	<atom:link href="https://chokomon.com/category/paiza/18-dp_primer/feed/" rel="self" type="application/rss+xml" />
	<link>https://chokomon.com</link>
	<description>ちょこっと頭を良くするIQパズル問題集</description>
	<lastBuildDate>Tue, 16 Aug 2022 18:34:51 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://chokomon.com/wp-content/uploads/2022/02/cropped-icon512-32x32.png</url>
	<title>DPメニュー - IQパズルステップ</title>
	<link>https://chokomon.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【DPメニュー】【部分和】部分和問題 4 (paizaランク B)-解答例-PHP編</title>
		<link>https://chokomon.com/18-dp_primer-06-04-00574/</link>
					<comments>https://chokomon.com/18-dp_primer-06-04-00574/#respond</comments>
		
		<dc:creator><![CDATA[東鳥子]]></dc:creator>
		<pubDate>Tue, 16 Aug 2022 18:33:48 +0000</pubDate>
				<category><![CDATA[DPメニュー]]></category>
		<category><![CDATA[paiza-問題集]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ランクB]]></category>
		<category><![CDATA[難易度-1700]]></category>
		<guid isPermaLink="false">https://chokomon.com/?p=6379</guid>

					<description><![CDATA[【DPメニュー】> FINAL問題【部分和】部分和問題 4 (paizaランク B 相当) [難易度: 1791 ±22] ※リンク先へ移動するためには[paiza]へのログインが必要です。 解答例]]></description>
										<content:encoded><![CDATA[
<p>【<a href="https://chokomon.com/paiza_mondai/18-dp_primer/">DPメニュー</a>】> <a href="https://paiza.jp/works/mondai/dp_primer/dp_primer_partial_sums_boss" target="_blank" rel="noreferrer noopener">FINAL問題【部分和】部分和問題 4 (paizaランク B 相当)</a> [難易度: <strong>1791 ±22</strong>]



<p>※リンク先へ移動するためには[<a href="https://paiza.jp/works" target="_blank" rel="noreferrer noopener">paiza</a>]へのログインが必要です。</p>



<figure class="wp-block-image aligncenter size-full"><img fetchpriority="high" decoding="async" width="660" height="300" src="https://chokomon.com/wp-content/uploads/2022/08/18-06-04-01.png" alt="" class="wp-image-6380"/></figure>



<div class="wp-block-dvaux-frame sc_frame_wrap inline"><div class="sc_frame_title inline" style="background-color:#ccc">問題文</div><div class="sc_frame" style="background-color:#fff;border-color:#ccc">
<p>1 ~ n の番号がついた n 種類のおもりがあり、おもり i の重さは a_i です。それぞれのおもりは無限個存在しており、任意のおもりを任意の個数使うことができます。</p>



<p>このとき、おもりを選んで重さの和を x となるようにすることができるかどうか判定してください。</p>



<p></p>



<p><strong>入力値（例）</strong><br>5 10<br>9<br>3<br>4<br>11<br>8</p>



<p><strong>出力値（例）</strong><br>yes</p>
</div></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">解答例</h2>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?php
    list($n, $x) = explode(" ", trim(fgets(STDIN)));
    
    for ($i = 0; $i &lt; $n; $i++) {
        $a[$i] = trim(fgets(STDIN));
    }

    $dp[0] = true;
    
    for ($i = 1; $i &lt;= $x; $i++) {
        $dp[$i] = false;
    }
    
    for($i = 0; $i &lt; $n; $i++){
        for($j = $a[$i]; $j &lt; $x+1; $j++){
            if($dp[$j-$a[$i]]) {
                $dp[$j] = true;
            }
        }
    }
    //print_r($dp);

    echo ($dp[$x]) ? "yes" : "no";
?&gt;</pre></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="660" height="160" src="https://chokomon.com/wp-content/uploads/2022/08/18-06-04-02.png" alt="" class="wp-image-6382"/></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://chokomon.com/18-dp_primer-06-04-00574/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【DPメニュー】部分和問題 3 (paizaランク B)-解答例-PHP編</title>
		<link>https://chokomon.com/18-dp_primer-06-03-00573/</link>
					<comments>https://chokomon.com/18-dp_primer-06-03-00573/#respond</comments>
		
		<dc:creator><![CDATA[東鳥子]]></dc:creator>
		<pubDate>Tue, 16 Aug 2022 17:58:18 +0000</pubDate>
				<category><![CDATA[DPメニュー]]></category>
		<category><![CDATA[paiza-問題集]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ランクB]]></category>
		<category><![CDATA[難易度-2000以上]]></category>
		<guid isPermaLink="false">https://chokomon.com/?p=6373</guid>

					<description><![CDATA[【DPメニュー】> 【部分和】STEP: 3 部分和問題 3 (paizaランク B 相当) [難易度: 2080 ±12] ※リンク先へ移動するためには[paiza]へのログインが必要です。 解答例 解説 1) 整数n、整数xを受け取りま…]]></description>
										<content:encoded><![CDATA[
<p>【<a href="https://chokomon.com/paiza_mondai/18-dp_primer/">DPメニュー</a>】> <a href="https://paiza.jp/works/mondai/dp_primer/dp_primer_partial_sums_step2" target="_blank" rel="noreferrer noopener">【部分和】STEP: 3 部分和問題 3 (paizaランク B 相当)</a> [難易度: <strong>2080 ±12</strong>]



<p>※リンク先へ移動するためには[<a href="https://paiza.jp/works" target="_blank" rel="noreferrer noopener">paiza</a>]へのログインが必要です。</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="660" height="300" src="https://chokomon.com/wp-content/uploads/2022/08/18-06-03-01.png" alt="" class="wp-image-6374"/></figure>



<div class="wp-block-dvaux-frame sc_frame_wrap inline"><div class="sc_frame_title inline" style="background-color:#ccc">問題文</div><div class="sc_frame" style="background-color:#fff;border-color:#ccc">
<p>1 ~ n の番号がついた n 個のおもりがあり、おもり i の重さは a_i です。</p>



<p>おもりを何個か選んで重さの和が x となるようにする方法を考えたとき、選ぶおもりの個数の最小値を出力してください。なお、同じおもりを2個以上選ぶことはできません。</p>



<p>なお、重さの和が x となるようにおもりを選ぶ方法が存在しない場合は-1と出力してください。</p>



<p></p>



<p><strong>入力値（例）</strong><br>5 10<br>7<br>3<br>4<br>3<br>2</p>



<p><strong>出力値（例）</strong><br>2</p>
</div></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">解答例</h2>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?php
    list($n, $x) = explode(" ", trim(fgets(STDIN)));
    
    for ($i = 0; $i &lt; $n; $i++) {
        $a[$i] = trim(fgets(STDIN));
    }

    $dp[0] = 0;
    
    for ($i = 1; $i &lt;= $x; $i++) {
        $dp[$i] = $n+1;
    }
    
    for($i = 0; $i &lt; $n; $i++){
        for($j = $x; $j &gt;= $a[$i]; $j--){
            if($dp[$j-$a[$i]] == $n+1)   continue;
            $dp[$j] = min($dp[$j], $dp[$j-$a[$i]]+1);
        }
    }
    //print_r($dp);

    echo ($dp[$x] == $n+1) ? -1 : $dp[$x];
?&gt;</pre></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="160" src="https://chokomon.com/wp-content/uploads/2022/08/18-06-03-02.png" alt="" class="wp-image-6375"/></figure>



<h2 class="wp-block-heading">解説</h2>



<p>1) 整数n、整数xを受け取ります。<br>2) 配列aを受け取ります。<br>3) 配列dp[i]にn+1を代入します。<br>4) i = 1～nで繰り返し設定をします。<br>5) 二重ループでj = x～a[i-1]で繰り返し処理を設定します。<br>6) dp[j]とdp[j-a[i-1]+1でおもりの少ない方で更新します。<br>7) dp[x]を返します。n+1個の場合は-1を返す。<br>コードの中で、n+1としているのは、おもりの個数はnなので、おもりをn+1個選ぶような状況は起こりえないためです。<br></p>
]]></content:encoded>
					
					<wfw:commentRss>https://chokomon.com/18-dp_primer-06-03-00573/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【DPメニュー】部分和問題 2 (paizaランク B)-解答例-PHP編</title>
		<link>https://chokomon.com/18-dp_primer-06-02-00572/</link>
					<comments>https://chokomon.com/18-dp_primer-06-02-00572/#respond</comments>
		
		<dc:creator><![CDATA[東鳥子]]></dc:creator>
		<pubDate>Mon, 15 Aug 2022 19:06:01 +0000</pubDate>
				<category><![CDATA[DPメニュー]]></category>
		<category><![CDATA[paiza-問題集]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ランクB]]></category>
		<category><![CDATA[難易度-2000以上]]></category>
		<guid isPermaLink="false">https://chokomon.com/?p=6368</guid>

					<description><![CDATA[【DPメニュー】> 【部分和】STEP: 2 部分和問題 2 (paizaランク B 相当) [難易度: 2056 ±33] ※リンク先へ移動するためには[paiza]へのログインが必要です。 解答例]]></description>
										<content:encoded><![CDATA[
<p>【<a href="https://chokomon.com/paiza_mondai/18-dp_primer/">DPメニュー</a>】> <a href="https://paiza.jp/works/mondai/dp_primer/dp_primer_partial_sums_step1" target="_blank" rel="noreferrer noopener">【部分和】STEP: 2 部分和問題 2 (paizaランク B 相当)</a> [難易度: <strong>2056 ±33</strong>]



<p>※リンク先へ移動するためには[<a href="https://paiza.jp/works" target="_blank" rel="noreferrer noopener">paiza</a>]へのログインが必要です。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="300" src="https://chokomon.com/wp-content/uploads/2022/08/18-06-02-01.png" alt="" class="wp-image-6369"/></figure>



<div class="wp-block-dvaux-frame sc_frame_wrap inline"><div class="sc_frame_title inline" style="background-color:#ccc">問題文</div><div class="sc_frame" style="background-color:#fff;border-color:#ccc">
<p>1 ~ n の番号がついた n 個のおもりがあり、おもり i の重さは a_i です。</p>



<p>おもりを何個か選んで重さの和が x となるようにする方法が何通りあるか求めてください。なお、同じおもりを2個以上選ぶことはできません。</p>



<p>重さが同じおもりが複数存在する場合、それらは区別して別のものとして扱うことにします。</p>



<p>答えは非常に大きくなる可能性があるので、答えを 1,000,000,007 で割った余りで出力してください。</p>



<p></p>



<p><strong>入力値（例）</strong><br>5 10<br>7<br>3<br>4<br>3<br>2</p>



<p><strong>出力値（例）</strong><br>3</p>
</div></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">解答例</h2>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?php
    list($n, $x) = explode(" ", trim(fgets(STDIN)));
    
    for ($i = 0; $i &lt; $n; $i++) {
        $a[] = trim(fgets(STDIN));
    }
    
    for ($i = 0; $i &lt;= $x; $i++) {
        $dp[$i] = 0;
    }
    
    $dp[0] = 1;
    
    for ($i = 0; $i &lt; $n; $i++) {
        for ($j = $x; $j &gt; $a[$i]-1; $j--) {
            if ($dp[$j - $a[$i]] &gt; 0) {
                $dp[$j] = ($dp[$j] + $dp[$j - $a[$i]]) % 1000000007;
            }
        }
    }

    echo $dp[$x];
?&gt;</pre></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="160" src="https://chokomon.com/wp-content/uploads/2022/08/18-06-02-02.png" alt="" class="wp-image-6370"/></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://chokomon.com/18-dp_primer-06-02-00572/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【DPメニュー】部分和問題 1 (paizaランク B)-解答例-PHP編</title>
		<link>https://chokomon.com/18-dp_primer-06-01-00571/</link>
					<comments>https://chokomon.com/18-dp_primer-06-01-00571/#respond</comments>
		
		<dc:creator><![CDATA[東鳥子]]></dc:creator>
		<pubDate>Mon, 15 Aug 2022 18:40:09 +0000</pubDate>
				<category><![CDATA[DPメニュー]]></category>
		<category><![CDATA[paiza-問題集]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ランクB]]></category>
		<category><![CDATA[難易度-1800]]></category>
		<guid isPermaLink="false">https://chokomon.com/?p=6360</guid>

					<description><![CDATA[【DPメニュー】> 【部分和】STEP: 1 部分和問題 1 (paizaランク B 相当) [難易度: 1875 ±24] ※リンク先へ移動するためには[paiza]へのログインが必要です。 解答例]]></description>
										<content:encoded><![CDATA[
<p>【<a href="https://chokomon.com/paiza_mondai/18-dp_primer/">DPメニュー</a>】> <a href="https://paiza.jp/works/mondai/dp_primer/dp_primer_partial_sums_step0" target="_blank" rel="noreferrer noopener">【部分和】STEP: 1 部分和問題 1 (paizaランク B 相当)</a> [難易度: <strong>1875 ±24</strong>]



<p>※リンク先へ移動するためには[<a href="https://paiza.jp/works" target="_blank" rel="noreferrer noopener">paiza</a>]へのログインが必要です。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="300" src="https://chokomon.com/wp-content/uploads/2022/08/18-06-01-01.png" alt="" class="wp-image-6364"/></figure>



<div class="wp-block-dvaux-frame sc_frame_wrap inline"><div class="sc_frame_title inline" style="background-color:#ccc">問題文</div><div class="sc_frame" style="background-color:#fff;border-color:#ccc">
<p>1 ~ n の番号がついた n 個のおもりがあり、おもり i の重さは a_i です。<br>おもりを何個か選んで重さの和が x となるようにすることができるかどうか判定してください。なお、同じおもりを2個以上選ぶことはできません。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">(ヒント)</h3>



<p>おもり 1 ~ n を用いて重さの和を x となるようにすることができるか、という問題を考えるために、部分問題としておもり 1 ~ n-1 を用いて重さの和を x となるようにすることができるか、という問題を考えてみましょう。</p>



<p>n-1 までのおもりを用いて重さの和を x または x-a_n となるようにすることができれば、おもり 1 ~ n を用いて重さの和を x となるようにすることができることがわかります。よって、最初はおもり 1 のみを使えることにして問題を解き、次にその結果を利用しておもり 1 ~ 2 を使えることにして問題を解く、ということを n まで繰り返せば、元の問題が解けそうです。</p>



<p>dp_k[x] を、おもり k までを用いて重さの和が x となるようにすることができるかどうかを表す真偽値とすると、上で考察した関係は漸化式で表すと&nbsp;<code>dp_k[x] = (dp_{k-1}[x] or dp_{k-1}[x-a_k])</code>&nbsp;となります。</p>



<p>dp_1, dp_2, ... と順に dp_n まで計算すれば問題の答えが求まります。dp_1 から dp_n のそれぞれに対応する n 本の1次元配列 (もしくはこれに相当する2次元配列) を使って実装してもよいのですが、dp_k[x] を求めるには dp_{k-1}[x] と dp_{k-1}[x-a_k] さえわかっていれば十分であることを踏まえると、ループの回し方を以下の様に工夫することで、これまでと同じように1本の1次元配列で解くことができます。</p>



<p class="has-gray-background-color has-background">for i = 0 to x<br>     dp[i] &lt;- false<br>dp[0] &lt;- true   // おもりを選ばなければ、重さの和を0とすることができる<br>for i = 1 to n  // おもり i までのおもりを使って<br>     for j = x down to a_i    // 重さの和を j とすることができるか？<br>         if dp[j-a_i] is true then<br>             dp[j] &lt;- true<br>if dp[x] is true then<br>     print "yes"<br>else     print "no" </p>



<p></p>



<p>j を x から a_i へ減らす方向にループを回していることに注意してください。逆に a_i から x へ 増やす方向にループを回すと正しく答えが求まらない可能性があります。理由を考えてみましょう (ヒント: n = 1, a_1 = 5, x = 10 のとき、ループの回し方によって答えはどうなるか？)</p>



<p></p>



<p><strong>入力値（例）</strong><br>5 19<br>7<br>18<br>5<br>4<br>8</p>



<p><strong>出力値（例）</strong><br>yes</p>
</div></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">解答例</h2>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?php
    list($n, $x) = explode(" ", trim(fgets(STDIN)));
    
    for ($i = 0; $i &lt; $n; $i++) {
        $a[] = trim(fgets(STDIN));
    }
    
    for ($i = 0; $i &lt;= $x; $i++) {
        $dp[$i] = false;
    }
    
    $dp[0] = true;
    
    for ($i = 0; $i &lt; $n; $i++) {
        for ($j = $x; $j &gt; $a[$i]-1; $j--) {
            if ($dp[$j - $a[$i]] == true) {
                $dp[$j] = true;
            }
        }
    }

    echo ($dp[$x] == true) ? "yes" : "no";
?&gt;</pre></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="160" src="https://chokomon.com/wp-content/uploads/2022/08/18-06-01-02.png" alt="" class="wp-image-6365"/></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://chokomon.com/18-dp_primer-06-01-00571/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【DPメニュー】【部分列】最長減少部分列 (paizaランク B)-解答例-PHP編</title>
		<link>https://chokomon.com/18-dp_primer-05-02-00570/</link>
					<comments>https://chokomon.com/18-dp_primer-05-02-00570/#respond</comments>
		
		<dc:creator><![CDATA[東鳥子]]></dc:creator>
		<pubDate>Mon, 15 Aug 2022 17:59:30 +0000</pubDate>
				<category><![CDATA[DPメニュー]]></category>
		<category><![CDATA[paiza-問題集]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ランクB]]></category>
		<category><![CDATA[難易度-1600]]></category>
		<guid isPermaLink="false">https://chokomon.com/?p=6351</guid>

					<description><![CDATA[【DPメニュー】> FINAL問題【部分列】最長減少部分列 (paizaランク B 相当) [難易度: 1646 ±19] ※リンク先へ移動するためには[paiza]へのログインが必要です。 解答例]]></description>
										<content:encoded><![CDATA[
<p>【<a href="https://chokomon.com/paiza_mondai/18-dp_primer/">DPメニュー</a>】> <a rel="noreferrer noopener" href="https://paiza.jp/works/mondai/dp_primer/dp_primer_lis_boss" target="_blank">FINAL問題【部分列】最長減少部分列 (paizaランク B 相当)</a> [難易度: <strong>1646 ±19</strong>]



<p>※リンク先へ移動するためには[<a href="https://paiza.jp/works" target="_blank" rel="noreferrer noopener">paiza</a>]へのログインが必要です。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="300" src="https://chokomon.com/wp-content/uploads/2022/08/18-05-02-01.png" alt="" class="wp-image-6352"/></figure>



<div class="wp-block-dvaux-frame sc_frame_wrap inline"><div class="sc_frame_title inline" style="background-color:#ccc">問題文</div><div class="sc_frame" style="background-color:#fff;border-color:#ccc">
<p>n 本の木が横一列に並んでいます。左から i 番目の木を木 i と呼ぶことにします。木 i の高さは a_i [cm] です。</p>



<p>あなたは、何本かの木を伐採することによって、残った木を左から順に見ると高さが単調減少になっているようにしたいと考えています。つまり、残った木を左から 木 k_1, 木 k_2, ... , 木 k_m とすると、<code>a_{k_1} &gt; a_{k_2} &gt; ... &gt; a_{k_m}</code>&nbsp;が満たされているようにしたいです。なるべく多くの木が残るように工夫して伐採する木を選んだとき、伐採されずに残る木の本数が最大でいくつになるか求めてください。</p>



<p>なお、最初から n 本の木が単調減少に並んでいる場合は、1本も伐採しなくてよいものとします。</p>



<p></p>



<p><strong>入力値（例）</strong><br>5<br>109<br>110<br>108<br>103<br>100</p>



<p><strong>出力値（例）</strong><br>4</p>
</div></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">解答例</h2>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?php
    $n = trim(fgets(STDIN));
    
    for ($i = 0; $i &lt; $n; $i++) {
        $a[] = trim(fgets(STDIN));
    }
    
    for ($i = 0; $i &lt; $n; $i++) {
        $dp[$i] = 1;
        for ($j = 0; $j &lt; $i; $j++) {
            if ($a[$j] &gt; $a[$i]) {
                $dp[$i] = max($dp[$i], $dp[$j]+1);
            }
        }
    }

    echo max($dp);
?&gt;</pre></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="160" src="https://chokomon.com/wp-content/uploads/2022/08/18-05-02-02.png" alt="" class="wp-image-6353"/></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://chokomon.com/18-dp_primer-05-02-00570/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【DPメニュー】最長部分増加列 (paizaランク B)-解答例-PHP編</title>
		<link>https://chokomon.com/18-dp_primer-05-01-00569/</link>
					<comments>https://chokomon.com/18-dp_primer-05-01-00569/#respond</comments>
		
		<dc:creator><![CDATA[東鳥子]]></dc:creator>
		<pubDate>Mon, 15 Aug 2022 17:44:00 +0000</pubDate>
				<category><![CDATA[DPメニュー]]></category>
		<category><![CDATA[paiza-問題集]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ランクB]]></category>
		<category><![CDATA[難易度-1800]]></category>
		<guid isPermaLink="false">https://chokomon.com/?p=6346</guid>

					<description><![CDATA[【DPメニュー】&#62; 【部分列】STEP: 1 最長部分増加列 (paizaランク B 相当)&#160;[難易度:&#160;1867&#160;±24] ※リンク先へ移動するためには[paiza]へのログインが必要です。 解答例]]></description>
										<content:encoded><![CDATA[
<p>【<a href="https://chokomon.com/paiza_mondai/18-dp_primer/">DPメニュー</a>】&gt; <a href="https://paiza.jp/works/mondai/dp_primer/dp_primer_lis_step0" target="_blank" rel="noreferrer noopener">【部分列】STEP: 1 最長部分増加列 (paizaランク B 相当)</a>&nbsp;[難易度:&nbsp;<strong>1867&nbsp;±24</strong>]



<p>※リンク先へ移動するためには[<a href="https://paiza.jp/works" target="_blank" rel="noreferrer noopener">paiza</a>]へのログインが必要です。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="300" src="https://chokomon.com/wp-content/uploads/2022/08/18-05-01-01.png" alt="" class="wp-image-6347"/></figure>



<div class="wp-block-dvaux-frame sc_frame_wrap inline"><div class="sc_frame_title inline" style="background-color:#ccc">問題文</div><div class="sc_frame" style="background-color:#fff;border-color:#ccc">
<p>n 本の木が横一列に並んでいます。左から i 番目の木を木 i と呼ぶことにします。木 i の高さは a_i [cm] です。<br>あなたは、何本かの木を伐採することによって、残った木を左から順に見ると高さが単調増加になっているようにしたいと考えています。つまり、残った木を左から 木 k_1, 木 k_2, ... , 木 k_m とすると、<code>a_{k_1} &lt; a_{k_2} &lt; ... &lt; a_{k_m}</code>&nbsp;が満たされているようにしたいです。なるべく多くの木が残るように、伐採する木を工夫して選んだとき、伐採されずに残る木の本数が最大でいくつになるか求めてください。<br>なお、最初から n 本の木が単調増加に並んでいる場合は、1本も伐採しなくてよいものとします。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">(ヒント)</h3>



<p>まずは問題を整理しましょう。この問題は、添字の部分列&nbsp;<code>x1 &lt; x2 &lt; ... &lt; xk</code>&nbsp;であって、<code>a_x1 &lt; a_x2 &lt; ... &lt; a_xk</code>&nbsp;を満たしているようなもの (これを、一般に増加部分列と呼びます) のうち、k が最も大きいもの (これを、一般に最長増加部分列 (Longest Increasing Subsequence, LIS) と呼びます) を求めよという問題に言い換えることができます。</p>



<p>dp[k] を、最後が木 k であるような増加部分列のうち最長であるものの長さとしてみましょう。dp[1] ~ dp[k-1] が求まっているとして、dp[k] とこれらの関係はどのようになっているかを考えてみましょう。</p>



<p>少し考えると、1以上 k 未満の i について a_i &lt; a_k が成り立っているとき、最後が木 i であるような増加部分列の最後に木 k をくっつけることで、新しく長さ dp[i] + 1 の増加部分列を作れることがわかります。そして、最後が木 k であるような最長増加部分列は、このようにして作られる部分列のうち最長のものであることがわかります。</p>



<p>これで、dp[1] ~ dp[k-1] と dp[k] の関係が明らかになりました。自信のある方は自分で漸化式を立ててみましょう。以下の疑似コードに従ってあなたの得意な言語で実装してみましょう。</p>



<p class="has-gray-background-color has-background">dp[1] &lt;- 1<br>for i = 2 to n<br>    dp[i] &lt;- 1  // 木 i のみからなる部分列の長さ<br>    for j = 1 to i-1<br>        if a[j] &lt; a[i] then<br>            dp[i] &lt;- max(dp[i], dp[j]+1) <br>　　　// 最後が木 j であるような増加部分列の末尾に木 i をくっつける<br> print max({dp[1], ... ,dp[n]})</p>



<p></p>



<p><strong>入力値（例）</strong><br>5<br>100<br>102<br>101<br>91<br>199</p>



<p><strong>出力値（例）</strong><br>3</p>
</div></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">解答例</h2>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?php
    $n = trim(fgets(STDIN));
    
    for ($i = 0; $i &lt; $n; $i++) {
        $a[] = trim(fgets(STDIN));
    }
    
    for ($i = 0; $i &lt; $n; $i++) {
        $dp[$i] = 1;
        for ($j = 0; $j &lt; $i; $j++) {
            if ($a[$j] &lt; $a[$i]) {
                $dp[$i] = max($dp[$i], $dp[$j]+1);
            }
        }
    }

    echo max($dp);
?&gt;</pre></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="160" src="https://chokomon.com/wp-content/uploads/2022/08/18-05-01-02.png" alt="" class="wp-image-6348"/></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://chokomon.com/18-dp_primer-05-01-00569/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【DPメニュー】【連続列】最長減少連続部分列 (paizaランク B)-解答例-PHP編</title>
		<link>https://chokomon.com/18-dp_primer-04-02-00568/</link>
					<comments>https://chokomon.com/18-dp_primer-04-02-00568/#respond</comments>
		
		<dc:creator><![CDATA[東鳥子]]></dc:creator>
		<pubDate>Sun, 14 Aug 2022 19:03:41 +0000</pubDate>
				<category><![CDATA[DPメニュー]]></category>
		<category><![CDATA[paiza-問題集]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ランクB]]></category>
		<category><![CDATA[難易度-1500]]></category>
		<guid isPermaLink="false">https://chokomon.com/?p=6332</guid>

					<description><![CDATA[【DPメニュー】> FINAL問題【連続列】最長減少連続部分列 (paizaランク B 相当) [難易度: 1555 ±18] ※リンク先へ移動するためには[paiza]へのログインが必要です。 解答例]]></description>
										<content:encoded><![CDATA[
<p>【<a href="https://chokomon.com/paiza_mondai/18-dp_primer/">DPメニュー</a>】> <a href="https://paiza.jp/works/mondai/dp_primer/dp_primer_lis_continuous_boss" target="_blank" rel="noreferrer noopener">FINAL問題【連続列】最長減少連続部分列 (paizaランク B 相当)</a> [難易度: <strong>1555 ±18</strong>]



<p>※リンク先へ移動するためには[<a href="https://paiza.jp/works" target="_blank" rel="noreferrer noopener">paiza</a>]へのログインが必要です。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="300" src="https://chokomon.com/wp-content/uploads/2022/08/18-04-02-01.png" alt="" class="wp-image-6333"/></figure>



<div class="wp-block-dvaux-frame sc_frame_wrap inline"><div class="sc_frame_title inline" style="background-color:#ccc">問題文</div><div class="sc_frame" style="background-color:#fff;border-color:#ccc">
<p>n 人が横一列に並んでいます。左から i 番目の人を人 i と呼ぶことにします。人 i の身長は a_i [cm]です。</p>



<p>人 l ,人 l+1, ... , 人 r からなる区間 [l, r] について、すべての l ≦ i &lt; r に対して a_i ≧ a_{i+1} が成り立っているとき、区間 [l, r] は逆背の順であると呼ぶことにします。また、区間 [l, r] の長さを r-l+1 とします。</p>



<p>逆背の順であるような区間のうち、最長であるものの長さを出力してください。</p>



<p></p>



<p><strong>入力値（例）</strong><br>5<br>187<br>192<br>115<br>108<br>109</p>



<p><strong>出力値（例）</strong><br>3</p>
</div></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">解答例</h2>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?php
    $n = trim(fgets(STDIN));
    
    $a = array();
    
    for ($i = 0; $i &lt; $n; $i++) {
        $a[] = trim(fgets(STDIN));
    }
    
    $dp = array();
    $dp[0] = 1;
    
    for ($i = 1; $i &lt; $n; $i++) {
        
        if ($a[$i-1] &gt;= $a[$i]) {
            $dp[$i] = $dp[$i-1] + 1;
            
        } else {
            $dp[$i] = 1;
        }
    }
    
    echo max($dp);
?&gt;</pre></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="160" src="https://chokomon.com/wp-content/uploads/2022/08/18-04-02-02.png" alt="" class="wp-image-6334"/></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://chokomon.com/18-dp_primer-04-02-00568/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【DPメニュー】最長増加連続部分列 (paizaランク B)-解答例-PHP編</title>
		<link>https://chokomon.com/18-dp_primer-04-01-00567/</link>
					<comments>https://chokomon.com/18-dp_primer-04-01-00567/#respond</comments>
		
		<dc:creator><![CDATA[東鳥子]]></dc:creator>
		<pubDate>Sun, 14 Aug 2022 18:36:54 +0000</pubDate>
				<category><![CDATA[DPメニュー]]></category>
		<category><![CDATA[paiza-問題集]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ランクB]]></category>
		<category><![CDATA[難易度-1700]]></category>
		<guid isPermaLink="false">https://chokomon.com/?p=6322</guid>

					<description><![CDATA[【DPメニュー】> 【連続列】STEP: 1 最長増加連続部分列 (paizaランク B 相当) [難易度: 1721 ±21] ※リンク先へ移動するためには[paiza]へのログインが必要です。 解答例]]></description>
										<content:encoded><![CDATA[
<p>【<a href="https://chokomon.com/paiza_mondai/18-dp_primer/">DPメニュー</a>】> <a href="https://paiza.jp/works/mondai/dp_primer/dp_primer_lis_continuous_step0" target="_blank" rel="noreferrer noopener">【連続列】STEP: 1 最長増加連続部分列 (paizaランク B 相当)</a> [難易度: <strong>1721 ±21</strong>]



<p>※リンク先へ移動するためには[<a href="https://paiza.jp/works" target="_blank" rel="noreferrer noopener">paiza</a>]へのログインが必要です。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="300" src="https://chokomon.com/wp-content/uploads/2022/08/18-04-01-01.png" alt="" class="wp-image-6323"/></figure>



<div class="wp-block-dvaux-frame sc_frame_wrap inline"><div class="sc_frame_title inline" style="background-color:#ccc">問題文</div><div class="sc_frame" style="background-color:#fff;border-color:#ccc">
<p>n 人が横一列に並んでいます。左から i 番目の人を人 i と呼ぶことにします。人 i の身長は a_i [cm]です。<br>人 l ,人 l+1, ... , 人 r からなる区間 [l, r] について、すべての l ≦ i &lt; r に対して a_i ≦ a_{i+1} が成り立っているとき、区間 [l, r] は背の順であると呼ぶことにします。また、区間 [l, r] の長さを r-l+1 とします。<br>背の順であるような区間のうち、最長であるものの長さを出力してください。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">(ヒント)</h3>



<p>元の問題を解くために、部分問題としてどのような問題を考えればよいでしょうか。</p>



<p>dp[n] を、人 n が右端となっているような背の順区間のうち、最長であるような区間の長さとしてみましょう。dp[1] ~ dp[k-1] が既に求まっているとして、dp[k] がどうなるかを考えてみましょう。dp[k-1] に注目すると、dp[k-1] は人 k-1 を右端とする背の順区間の長さですから、もし a_{k-1} ≦ a_k なら、その区間の右端に人 k をくっつけることで新しく長さ dp[k-1]+1 の背の順区間を作ることができ、この区間の長さは人 k を右端として持つ背の順区間のうち最長であることがわかります。逆に、もし a_{k-1} ＞ a_k なら、人 k が右端となるような背の順区間は人 k のみからなる長さ1の区間しか存在しないことがわかります。</p>



<p>以上の考察により、dp[k-1] と dp[k] の関係が明らかになりました。自信のある人は自分で漸化式を立ててみましょう。以下の疑似コードに従って、自分の得意な言語で実装してみましょう。</p>



<p class="has-gray-background-color has-background">dp[1] &lt;- 1 for i = 2 to n<br>     if a[i-1] &lt;= a[i] then<br>         dp[i] &lt;- dp[i-1]+1<br>     else<br>         dp[i] &lt;- 1<br> print max({dp[1], ... ,dp[n]})</p>



<p></p>



<p></p>



<p><strong>入力値（例）</strong><br>5<br>160<br>178<br>170<br>190<br>190</p>



<p><strong>出力値（例）</strong><br>3</p>
</div></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">解答例</h2>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?php
    $n = trim(fgets(STDIN));
    
    $a = array();
    
    for ($i = 0; $i &lt; $n; $i++) {
        $a[] = trim(fgets(STDIN));
    }
    
    $dp = array();
    $dp[0] = 1;
    
    for ($i = 1; $i &lt; $n; $i++) {
        
        if ($a[$i-1] &lt;= $a[$i]) {
            $dp[$i] = $dp[$i-1] + 1;
            
        } else {
            $dp[$i] = 1;
        }
    }
    
    echo max($dp);
?&gt;</pre></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="160" src="https://chokomon.com/wp-content/uploads/2022/08/18-04-01-02.png" alt="" class="wp-image-6325"/></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://chokomon.com/18-dp_primer-04-01-00567/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【DPメニュー】【最安値】最安値を達成するには 4 (paizaランク B)-解答例-PHP編</title>
		<link>https://chokomon.com/18-dp_primer-03-04-00566/</link>
					<comments>https://chokomon.com/18-dp_primer-03-04-00566/#respond</comments>
		
		<dc:creator><![CDATA[東鳥子]]></dc:creator>
		<pubDate>Sun, 14 Aug 2022 17:14:35 +0000</pubDate>
				<category><![CDATA[DPメニュー]]></category>
		<category><![CDATA[paiza-問題集]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ランクB]]></category>
		<category><![CDATA[難易度-1600]]></category>
		<guid isPermaLink="false">https://chokomon.com/?p=6315</guid>

					<description><![CDATA[【DPメニュー】> FINAL問題【最安値】最安値を達成するには 4 (paizaランク B 相当) [難易度: 1665 ±17] ※リンク先へ移動するためには[paiza]へのログインが必要です。 解答例]]></description>
										<content:encoded><![CDATA[
<p>【<a href="https://chokomon.com/paiza_mondai/18-dp_primer/">DPメニュー</a>】> <a href="https://paiza.jp/works/mondai/dp_primer/dp_primer_apples_boss" target="_blank" rel="noreferrer noopener">FINAL問題【最安値】最安値を達成するには 4 (paizaランク B 相当)</a> [難易度: <strong>1665 ±17</strong>]



<p>※リンク先へ移動するためには[<a href="https://paiza.jp/works" target="_blank" rel="noreferrer noopener">paiza</a>]へのログインが必要です。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="300" src="https://chokomon.com/wp-content/uploads/2022/08/18-03-04-01.png" alt="" class="wp-image-6316"/></figure>



<div class="wp-block-dvaux-frame sc_frame_wrap inline"><div class="sc_frame_title inline" style="background-color:#ccc">問題文</div><div class="sc_frame" style="background-color:#fff;border-color:#ccc">
<p>八百屋にて、りんご x 個が a 円で、りんご y 個が b 円で、りんご z 個が c 円で売られています。</p>



<p>りんごの買い方を工夫したとき、n 個のりんごを手に入れるために必要な金額の最小値はいくらでしょうか。なお、買い方を工夫した結果、買ったりんごが n+1 個以上になってもよいものとします。</p>



<p></p>



<p><strong>入力値（例）</strong><br>9 2 100 3 125 5 200</p>



<p><strong>出力値（例）</strong><br>375</p>
</div></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">解答例</h2>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?php
    list($n, $x, $a, $y, $b, $z, $c) = explode(" ", trim(fgets(STDIN)));
    
    $dp[0] = 0;
    
    for ($i = 1; $i &lt;= ($n + $z); $i++) {
        $dp_a = $i &gt; $x ? $dp[$i - $x] + $a : $a;
        $dp_b = $i &gt; $y ? $dp[$i - $y] + $b : $b;
        $dp_c = $i &gt; $z ? $dp[$i - $z] + $c : $c;
        
        $dp[$i] = min($dp_a, $dp_b, $dp_c);
    }
    
    echo $dp[$n];
?&gt;</pre></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="160" src="https://chokomon.com/wp-content/uploads/2022/08/18-03-04-02.png" alt="" class="wp-image-6317"/></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://chokomon.com/18-dp_primer-03-04-00566/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【DPメニュー】最安値を達成するには 3 (paizaランク B)-解答例-PHP編</title>
		<link>https://chokomon.com/18-dp_primer-03-03-00565/</link>
					<comments>https://chokomon.com/18-dp_primer-03-03-00565/#respond</comments>
		
		<dc:creator><![CDATA[東鳥子]]></dc:creator>
		<pubDate>Sun, 14 Aug 2022 16:56:22 +0000</pubDate>
				<category><![CDATA[DPメニュー]]></category>
		<category><![CDATA[paiza-問題集]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ランクB]]></category>
		<category><![CDATA[難易度-1700]]></category>
		<guid isPermaLink="false">https://chokomon.com/?p=6309</guid>

					<description><![CDATA[【DPメニュー】> 【最安値】STEP: 3 最安値を達成するには 3 (paizaランク B 相当) [難易度: 1717 ±20] ※リンク先へ移動するためには[paiza]へのログインが必要です。 解答例]]></description>
										<content:encoded><![CDATA[
<p>【<a href="https://chokomon.com/paiza_mondai/18-dp_primer/">DPメニュー</a>】> <a href="https://paiza.jp/works/mondai/dp_primer/dp_primer_apples_step2" target="_blank" rel="noreferrer noopener">【最安値】STEP: 3 最安値を達成するには 3 (paizaランク B 相当)</a> [難易度: <strong>1717 ±20</strong>]



<p>※リンク先へ移動するためには[<a href="https://paiza.jp/works" target="_blank" rel="noreferrer noopener">paiza</a>]へのログインが必要です。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="300" src="https://chokomon.com/wp-content/uploads/2022/08/18-03-03-01.png" alt="" class="wp-image-6310"/></figure>



<div class="wp-block-dvaux-frame sc_frame_wrap inline"><div class="sc_frame_title inline" style="background-color:#ccc">問題文</div><div class="sc_frame" style="background-color:#fff;border-color:#ccc">
<p>八百屋にて、りんご x 個が a 円で、りんご y 個が b 円で売られています。</p>



<p>りんごの買い方を工夫したとき、最終的に n 個のりんごを手に入れるために必要な金額の最小値はいくらでしょうか。なお、買い方を工夫した結果、買ったりんごが n+1 個以上になってもよいものとします。</p>



<p></p>



<p><strong>入力値（例）</strong><br>4 2 110 5 200</p>



<p><strong>出力値（例）</strong><br>200</p>
</div></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">解答例</h2>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?php
    list($n, $x, $a, $y, $b) = explode(" ", trim(fgets(STDIN)));
    
    $dp[0] = 0;
    
    for ($i = 1; $i &lt;= ($n + $y); $i++) {
        $dp_a = $i &gt; $x ? $dp[$i - $x] + $a : $a;
        $dp_b = $i &gt; $y ? $dp[$i - $y] + $b : $b;
        
        $dp[$i] = min($dp_a, $dp_b);
    }
    
    echo $dp[$n];
?&gt;</pre></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="160" src="https://chokomon.com/wp-content/uploads/2022/08/18-03-03-02.png" alt="" class="wp-image-6311"/></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://chokomon.com/18-dp_primer-03-03-00565/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
