[Topcoder] SRM474

Div. 2 Lev. 3

主要思想:DP

由于题目中点的数量不超过16个,因此可以用一个整数来表示,第i位为1表示考虑第i个点。如101表示考虑第1,3个点。

由于给出的二维点没说有序,所以分解问题时得考虑其所有的子集。

 

定义opt[2^n],n为二维点个数。

opt[i] 为考虑i所代表的这些二维点的最优结果。

则最优子结构:

opt=minj{opt[i-j] + res[j]}

其中res[j]为将j所代表的这些二维点用一个框框起来的成本。初值opt[0] = 0,其它为-1。

 

提示:

opt定义:opt[1<<n];

 

for (int i = 0; i < 1<<n; i++)    // 第i种二维点组合

    for (int j = 0; j < n; j++)      // 第j个点

        if ((i >> j) & 1)                 // 当前组合中包含第j个点

            // 算res

 

最优子结构(遍历i所代表所有点的子集):

for (int i = 0; i < 1<<n; i++)

    for (int j = i; j > 0; j= (j - 1) & i)

       

 

 

 

你可能感兴趣的:([Topcoder] SRM474)