洛谷 1282 多公尺諾骨牌

2022-03-02 01:03:45 字數 1128 閱讀 8578

多公尺諾骨牌有上下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°,使得上下兩個方塊互換位置。 程式設計用最少的旋轉次數使多公尺諾骨牌上下2行點數之差達到最小。

對於圖中的例子,只要將最後乙個多公尺諾骨牌旋轉180°,可使上下2行點數之差為0。

輸入格式:

輸入檔案的第一行是乙個正整數n(1≤n≤1000),表示多公尺諾骨牌數。接下來的n行表示n個多公尺諾骨牌的點數。每行有兩個用空格隔開的正整數,表示多公尺諾骨牌上下方塊中的點數a和b,且1≤a,b≤6。

輸出格式:

輸出檔案僅一行,包含乙個整數。表示求得的最小旋轉次數。

輸入樣例#1:

4

6 11 5

1 31 2

輸出樣例#1:

1

dp[i][j] 表示 前i張多公尺諾骨牌裡,上邊的減下邊的差值為j 的 最小翻轉次數

分 翻和不翻 轉移

因為j有可能為負,所以全體後移m,m根據情況自定

開始輸出答案的時候,

for(int i=0;i<=n;i++) 判斷 dp[n][i+m] 或 dp[n][m]

錯誤應該是 先單獨判斷 dp[m]

然後for 從1開始

因為dp[0] 表示的是 差為0-m

只有dp[m] 表示 差為0

(0只有1個,不需要考慮絕對值)

#include#include

#include

#define n 1001

using

namespace

std;

int a[n],b[n],dp[n][10001

];int

main()

if(dp[n][m]!=-1)

for(int i=1;i<=m;i++)

if(dp[n][i+m]!=-1) }}

洛谷1282 多公尺諾骨牌

是傳送門啊 又是一道時隔多年不太會寫的題qwq 思路 想了一會 覺得可以設f i j 為前i個牌旋轉j次的最小上下點數差 但是這樣好像又不對 因為這個區域性最優並不一定可以得到全域性最優啊 於是又想了想 終於喚起了原來寫這道題的記憶 令f i j 為前i張牌 上面的骨牌點數和為j的最小旋轉次數 co...

洛谷 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 使得上下兩個方塊互換位置。程式設計...