前提・実現したいこと
しゃくとり法を使って、要素の和が M を超えないような A の部分列の最大の長さを求めたいのですがうまくいきません。
考えている構造はこのような形です、が、最大の長さがうまくでなくて困っています。
発生している問題・エラーメッセージ
リンク内容
エラーメッセージは出ないですが区間の最大値と異なる値が出ます。
該当のソースコード
php
1<?php 2 3 /* 4 数列 A の要素数 N と値 M、その要素 A_1, A_2 ... A_N が与えられます。 5 要素の和が M を超えないような A の部分列の最大の長さを求めてください。 6 */ 7 8 //取得 9 $input = explode(" ",trim(fgets(STDIN))); 10 $num = $input[0]; 11 $m = $input[1]; 12 13 $a = explode(" ",trim(fgets(STDIN))); 14 15 16 //累積和を求める 17 $sum[0] = 0; 18 for($i=0; $i<$num; $i++){ 19 $sum[$i+1] = $sum[$i] + $a[$i]; 20 } 21 22 23 //処理 24 25 $ok_flag = false; //reset 26 $right = 1;//区間の右端 27 28 for ($left = 1; $left < $num; $left++) { 29 while($right < $num){ 30 if($sum[$right] - $sum[$left] < $m){ 31 $ok_flag = true; 32 $right++;//右に伸ばせるだけ伸ばす 33 }else{ 34 //右に伸ばせなくなったのでその時点を格納 35 $save[] = $right-$left; 36 break; 37 } 38 } 39 } 40 41 42 //出力 43 if($ok_flag==false){ 44 echo(0); 45 }else{ 46 echo(max($save)); 47 } 48 49 50?>
試したこと
Aが10万個の整数のバリエがあるため、累積和としゃくとり法について調べました。しゃくとり法は区間の左端を固定し右端をのばすということで、区間の右端を伸ばせるだけ伸ばし、伸ばせなくなったら区間数を配列$saveに格納するようにしました。
補足情報(FW/ツールのバージョンなど)
しゃくとり法について調べるきっかけになった問題元はこちらですが、この問題を解きたいというよりしゃくとり法が実装できるように理解したいです。
あなたの回答
tips
プレビュー