P1282 多公尺諾骨牌

2022-06-01 15:30:13 字數 1318 閱讀 3877

題目描述

多公尺諾骨牌有上下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:

461

1513

12

輸出樣例#1:

1

狀態轉移方程

c[i][j]=min(c[i-1][j-d[i]],c[i-1][j+d[i]]+1)

i:前i個骨牌

j:前i個骨牌上下方塊點數的差

c[i][j] 表示前i個骨牌上下方塊點數差為j的最小旋轉次數(所以是min)

d[i]為第i個骨牌上下方塊點數的差

1 #include2 #include3

using

namespace

std;

4int a[1002]=,b[1002]=,d[1002]=;

5int c[1002][10001]=;

6int min(int a,intb)7

13int

main()

1423 k=1002

;24 c[0][5000]=0;25

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

26for(j=-5000;j<=5000;j++)

27 c[i][5000+j]=min(c[i-1][5000+j-d[i]],c[i-1][5000+j+d[i]]+1); //

<-狀態轉移方程

28 j=5000;29

while(j<10000)30

39 cout<40return0;

41 }

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 多公尺諾骨牌

p1282多公尺諾骨牌 這個題其實挺水的,主要是對於這個狀態的理解 1.dp i j dp i j a i b i 2.dp i j dp i j b i a i 1 兩個狀態取乙個min就行了。為什麼這樣的轉移是合理的呢。我們規定上面一半的點數為a i 下面一半的點數為b i 那麼首先我們看 1....