この質問は非常に水であるが、私はまだチューン0.25時間
兄のWSYの助けのおかげで
えー......
まず第一に、これは間違いなく、DPのN * Kであります
ここで、私はjはトランスポートが押してJを必要と表し、i番目の項目を表し、
だから我々は、その遷移方程式を描くことができます。
DP [I] [J] =分(DP [I- 1 ] [j]は、DP [I- 2 ] [J- 1 ] +(INT)POW((W [i]は-w [I- 1 ]) 、2))。
非常にシンプルさせた後
私は、次の最も頭痛を与えた奇妙な、私が出てくると思った以上の10分、
初期化
ここで私はもともと、初期化を書いたものです。
memsetの(DP、から0x7f、はsizeof(DP))。
然后各种WA
次いで、ビット変化(25分)を以下のように:
以下のために(INT iが= 0 ; I <= N; I ++)のための(INT J = 1 ; J <= K; J ++)DP [I] [J] = INF。
その後、AC!!!
私にチューン0.25時間をmemsetを!(まあ価値)
以下は、ACコードです:
書式#include <iostreamの> 書式#include <stdio.hに> する#include <アルゴリズム> 書式#include < 文字列の.h> の#include <cmath> に#define 2147483647 INF 使用して 名前空間はstdを、 整数N、K。 INT [W 2005 ]。 int型 DP [ 2005 ] [ 2005 ]; int型のmain() { 一方、(scanf関数(" %D%D "、&N&K)!= EOF) { 以下のために(INT iが= 0 ; I <= N; I ++)のための(INT J = 1 ; J <= K; J ++)DP [I] [J] = INF。 // memsetの(DP、0x7fの、はsizeof(DP)); 以下のために(INT iが= 1 ; I <= N; I ++)のscanf(" %dの"、および[I] W)。 ソート(W + 1、W + 1 + N)。 DP [ 0 ] [ 0 ] = 0 ; 以下のために(INT iが= 2 ; I <= N; I ++)のための(INT J = 0 ; 2 * J <= I; J ++ ) { DP [I] [J] =分(DP [I- 1 ] [j]は、DP [I- 2 ] [J- 1 ] +(INT)POW((W [i]は-w [I- 1 ]) 、2 ))。 // coutの<< "DP [" << I << "] [" << J << "] =" << DP [I] [J] <<てendl; } printf(" %D \ n " 、DP [n]が[K])。 } リターン 0 ; }
私は深い教訓から得たこの質問
決して信頼のmemset
この質問は水全体でこのようなので......