DPの問題(2):HDU 1421

この質問は非常に水であるが、私はまだチューン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

この質問は水全体でこのようなので......

 

おすすめ

転載: www.cnblogs.com/juruo-hxy/p/11984843.html