P1509ああを検索しGFを見つけるために検索しました
問題の解決策
これは明らかに、二次元のバックパックのトピックです
DP配列を行うことができないならば、我々は戻って、DP配列を来ります
要求の対象は、消費が文字R、できるだけ少しのように多くの時間としてバブルの姉妹を超えていない、メートルを超えない取りません
F [I] [J] M以下で過ごすため、消費文字jを超えない、気泡の最大数は、姉妹であることができます
G [i] [j]は、消費が文字jを超えない、よりMよりも、最小の時間姉妹を吸収することができません過ごすために
注意:
1. fは[i]は[j]が同じであってもよいが、対応するG [I] [j]を有する異なる、すなわち、
2. ANSは同じでもよいが、対応するG [I] [j]を有する異なる、すなわち、
3.上部はほぼ同じものが、それでも警告の言葉、できるだけ姉妹にバブルに人を言って、彼はバブルなかったが
コード
書式#include <iostreamの> の#include <cstdioを> する#include <cstdlib> 書式#include <アルゴリズム> 書式#include <cmath> の#include < 文字列 > の#include <CStringの> の#include <キュー> 使用して 名前空間はstdを、 typedefの長い 長いLL。 インラインint型は、(読み) { int型 ANS = 0 ; チャー最後=を' '、CH = GETCHAR()。 一方、(CH < ' 0 ' || CH> ' 9 ')最後= CH、CH = GETCHAR()。 一方、(CH> = ' 0 ' && CH <= ' 9 ')ANS = ANS * 10 + CH- ' 0 '、CH = GETCHAR()。 もし(最後== ' - ')ANS = - ANS; 戻り値は、ANS; } 整数N、M、R。 INT RMB [ 105 ] RP [ 105 ]ティム[ 105 ]。 INT F [ 105 ] [ 105 ] G [ 105 ] [ 105 ]。 int型の年= 0、なし= 2147483645 ; int型のmain() { N = )(読み取ります。 以下のために(INT iが= 1 ; I <= N; I ++)RMBは[I] = [I] =)(TIMを読み取り、)(RPを読み取る[I] = )(読み取ります。 M =読み取る(); R = 読み取り()。 用(int型のk = 1 ; K <= N; K ++ ) のための(INT ; I I = M>; = RMB [K] i-- ) のための(INT J = R; J> = RP [K]; J- - ){ 場合(F [I-RMB [K] [J-RP [K] + 1 > F [I] [J]){ F [I] [J] = F [I-RMB [] K] + [] K [J-RP] 1 。 G [I] [J] = G [I-RMB [K] [J-RPは、[K] + ティム[K]。 } もし(F [I-RMB [K] [J-RP [K] + 1 == F [I] [J]){ G [I] [J] =分(G [I] [J] gは[I-RMB [K] [J-RPは、[K] + ティム[K])。 } であれば(F [I] [J] == ANS)RES = 分(RES、G [i]は[J])。 もし(F [I] [J]> ANS)ANS = F [I] [J]、RES = G [I] [J]。 } もし(RES> 214748364 ){ printf(" 0 \ N " ); リターン 0 ; } printf(" %dの\ n " 、RES)。 リターン 0 ; }