タイトルを読み取ることによって、我々は非常に万里の長城の建設のようにこの質問を見つけ、可能性が万里の長城を構築し、簡単にいくつかの優れた修復が、彼女はこの質問に送られたピザが良くなることができないと感じています
完全に万里の長城の建設などの問題を解決しないように、「助成」、そしてこの質問は、どのようにそれを行うには?
そして、タイトルを読んでから、私たちは状態がに寸法以上の意思決定の数を増やすことができることを教えてくれる、単位時間当たりの各顧客のコスト、ため同じ非常に少ないデータ範囲を発見し、
この質問は近くにあり、私たちはピザを送信するためにどの顧客に判断できないため、関係なく、顧客の、それは状態に反映されなければなりません。
我々は関係なく、pが0の説明である間隔(この間隔は、またはピザを送信していない可能性もある)だけでなく、ユーザkの最大の利益にピザのうちのD(I、J、K、P)を表すが、[I、J]に設定しましたI部門、
pが1つのJの説明、番組を見るためにラインの状態遷移方程式、ここでは、非常に巧妙を求める方法は、コードされた時間です。
// UVA 1628 の#include <cstdioを> する#include <アルゴリズム> 書式#include <cmath> 使用して 名前空間はstd; const int型 MAXN = 100 + 5 。 int型N、POS [MAXN]、V [MAXN]、カセ。 INT D [MAXN] [MAXN] [MAXN] [ 2 ]、VIS [MAXN] [MAXN] [MAXN] [ 2 ]。 INT DP(INT S、INT E、INT K、INT P){ もし(K == 0)戻り 0 ; INT&ANS =D [S] [E] [K] [P]。 もし(VIS [S] [E] [K] [P] ==加瀬)リターンANS。 VIS [S] [E] [K] [P] = カセ。 ANS = 0 ; もし(!のP){ のために(int型私= 0 ;私は、S <; ++ I) ANS = MAX(ANS、V [i]は-k * ABS(POS [i]は-pos [S])+ DP(I 、E、K- 1、0 ))。 用(int型 I = E + 1、iがN <; ++ i)は ANS = MAX(ANS、V [i]は-k * ABS(POS [I] -pos [S])+ DP(S、iは、K- 1、1))。 } 他{ ため(int型 i = 0 ; iがSを<; ++ I) ANS = MAX(ANS、V [i]は-k * ABS(POS [I] -pos [E])+ DP(I、E、K - 1、0 ))。 用(int型 I = E + 1 ; iがN <++ i)は ANS = MAX(ANS、V [i]は-k * ABS(POS [I] -pos [E])+ DP(S、I、K- 1、1 ))。 } 戻りANS。 } int型のmain(){ int型のT。 scanf関数(" %のD "、&T)。 用(加瀬= 1 ;カセ<= T; ++ 加瀬){ scanf関数(" %のD "、&N) 以下のために(int型私= 0 ; iがN <; ++ i)は、scanf関数(" %のD "、&POS [I])。 以下のために(int型 i = 0 ; iがn <; ++ I)のscanf(" %dの"、&V [I])。 int型 ANS = 0 ; 用(int型のk = 1 ; K <= N; ++ K) のための(INT I = 0; 私は、n <; ++I) ANS = MAX(ANS、V [i]は-k * ABS(POS [I])+ DP(I、I、K- 1、0 ))。 printf(" %d個の\ n " 、ANS)。 } 戻り 0 。 }