Advertisement

POJ 1717 Dominoes属于背包问题

阅读量:

题目含义:
多米诺骨牌由上下两个方块构成,每个方块内包含1至6个点。当前这些骨牌排成一行,
上方所有方块的点数总和记作S1,下方所有方块的点数总和记作S2,二者之差为|S1-S2|。
例如在图8-1中,S1=6+1+1+1=9,S2=1+5+3+2=11,|S1-S2|=2。每一个多米诺骨牌均可旋转180°,
从而实现上下两个方块位置的调换。
编程目标是通过最少次数的旋转操作,使多米诺骨牌上下两行点数之差达到最小值。

本题关键点:
1、状态表示:
dp[i][j] 表示处理前i个多米诺骨牌后,上行与下行点数之差为j时所需的最少翻转次数。
由于差值j可能为负数,因此引入一个偏移量 base = 6000。
具体而言,0 对应 -6000,6000 对应 0,而 12000 则对应 6000。
2、状态转移公式:
dp[i][j + base] = min(dp[i - 1][j + base - ans], dp[i - 1][j + base + ans] + 1);

复制代码
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    using namespace std;
    const int MaxN = 1010, base = 600

全部评论 (0)

还没有任何评论哟~