好題!
第一眼就感覺是dp。
設dp[i][j]表示到第i個位置上面-下面為j的最小步數。
可以發現,這裡由於上面-下面可能是負的。
那麼單純去dp顯然不行。
這裡就用到了乙個思想,零點轉移。
因為差距最多在5,6000左右,我們設6000為0點,那麼-t就變成了6000-t。
然後就可以去dp了,正負分開下判斷即可。
//view codeauthor: levil
#includeusing
namespace
std;
typedef
long
long
ll;typedef pair
pii;
const
int n = 1e3+5
;const
int m = 2e4+5
;const ll mod = 1e9+7
;#define rg register
#define pi acos(-1)
#define inf 1e9
#define ct0 cin.tie(0),cout.tie(0)
#define io ios::sync_with_stdio(false)
#define dbg(ax) cout << "now this num is " << ax << endl;
namespace
fastio
while(c >= '
0' && c <= '9')
return x*f;
}void print(int
x)
if(x > 9) print(x/10
); putchar(x%10+'0'
); }
}using
namespace
fastio;
void fre()
int a[1005],b[1005],dp[n][12005
];int
main()
else
}int ans =inf,step;
for(int i = 0;i <= 12000;++i)
printf(
"%d\n
",step);
system(
"pause
");
}
洛谷 P1282 多公尺諾骨牌
題目描述 多公尺諾骨牌有上下2個方塊組成,每個方塊中有1 6個點。現有排成行的 上方塊中點數之和記為s1,下方塊中點數之和記為s2,它們的差為 s1 s2 例如在圖8 1中,s1 6 1 1 1 9,s2 1 5 3 2 11,s1 s2 2。每個多公尺諾骨牌可以旋轉180 使得上下兩個方塊互換位置...
洛谷p1282多公尺諾骨牌
多公尺諾骨牌有上下2個方塊組成,每個方塊中有1 6個點。現有排成行的 上方塊中點數之和記為s1,下方塊中點數之和記為s2,它們的差為 s1 s2 例如在圖8 1中,s1 6 1 1 1 9,s2 1 5 3 2 11,s1 s2 2。每個多公尺諾骨牌可以旋轉180 使得上下兩個方塊互換位置。程式設計...
洛谷p1282多公尺諾骨牌
大佬的思路 這其實是一道 披著狼皮的揹包題 我們只需要對狀態稍作調整就可以套揹包啦 我們先把骨牌翻轉,調整至點數大的在上面 這樣,我們就能保證上方的點數一定比下方大,並且保證每翻轉一 次,都能使上下的點數之差變小,而變小的點數,就是上下點數之差乘以2。把改變的點數看成物品的體積,初始上下方的點數之差...