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)
还没有任何评论哟~
