洛谷P1043數字遊戲題解 zhengjun

2021-10-04 14:07:34 字數 3025 閱讀 4105

題目描述

丁丁最近沉迷於乙個數字遊戲之中。這個遊戲看似簡單,但丁丁在研究了許多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數(一共n

nn個),你要按順序將其分為m

mm個部分,各部分內的數字相加,相加所得的m

mm個結果對10

1010

取模後再相乘,最終得到乙個數k

kk。遊戲的要求是使你所得的k最大或者最小。

例如,對於下面這圈數字(n=4

,m=2

n=4,m=2

n=4,m=

2):要求最小值時,((2

−1)m

od10)

×((4

+3)m

od10)

=1×7

=7

((2-1) \bmod 10)×((4+3) \bmod 10)=1×7=7

((2−1)

mod1

0)×(

(4+3

)mod

10)=

1×7=

7,要求最大值時,為((2

+4+3

)mod

10)×(

−1mo

d10)=

9×9=

81((2+4+3) \bmod 10)×(-1 \bmod 10)=9×9=81

((2+4+

3)mo

d10)

×(−1

mod1

0)=9

×9=8

1。特別值得注意的是,無論是負數還是正數,對10

1010

取模的結果均為非負值。

丁丁請你編寫程式幫他贏得這個遊戲。

輸入格式

輸入檔案第一行有兩個整數,n(1

≤n≤50

)n(1≤n≤50)

n(1≤n≤

50)和m(1

≤m≤9

)m(1≤m≤9)

m(1≤m≤

9)。以下n

nn行每行有個整數,其絕對值 ≤10

4\le 10^4

≤104

,按順序給出圈中的數字,首尾相接。

輸出格式

輸出檔案有2

22行,各包含1

11個非負整數。第1

11行是你程式得到的最小值,第2

22行是最大值。

輸入輸出樣例

輸入 #1 複製

424

3-12

輸出 #1 複製
7

81

這題是乙個典型的區間dp。

為了讓乙個環變成一條鏈,就可以把換剪開,在剪開的地方新增剪開前相連的數,然後就是把原陣列翻了兩倍,這樣做dp就可以了,不過還要注意一下最終的答案要重新找一下。

用f i,

j,kf_

fi,j,k

​表示在i

ii到j

jj的區間中分成k

kk份所得的最大(最小)值。

轉移公式:

f i,

j,k=

max⁡

/min

⁡f_=\max/\min\+sum_\bmod10\}

fi,j,k

​=max/

min

i +k

−2≤t

sumi

,j

i+k-2\leq ti+

k−2≤

tsumi

,j​表示從i

ii到j

jj段的總和

這個s um

sumsu

m可以用字首和處理出來

#include

#define max(x,y) ((x)>(y)?(x):(y))

#define min(x,y) ((x)<(y)?(x):(y))

using

namespace std;

int n,m;

int minf[

101]

[101][

10],maxf[

101]

[101][

10];int a[

101]

;int

mod(

int x)

intmain()

for(

int i=

2;i<=

2*n;i++

)a[i]

+=a[i-1]

;//字首和

for(

int i=

1;i<=

2*n;i++

)for

(int j=i+

1;j<=

2*n;j++

)for

(int k=

2;k<=j-i+

1;k++

) minf[i]

[j][k]

=0x7fffffff

;//初始值

for(

int i=

1;i<=

2*n;i++

)for

(int j=i;j<=

2*n;j++

) minf[i]

[j][1]

=maxf[i]

[j][1]

=mod

(a[j]

-a[i-1]

);//不分的時候就是這段的和mod 10

for(

int i=

2;i<=m;i++)}

}}int minans=

0x7fffffff

,maxans=0;

for(

int i=

1;i<=n;i++

)printf

("%d\n%d"

,minans,maxans)

;//輸出

return0;

}

洛谷P1043 數字遊戲

丁丁最近沉迷於乙個數字遊戲之中。這個遊戲看似簡單,但丁丁在研究了許多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數 一共n個 你要按順序將其分為m個部分,各部分內的數字相加,相加所得的m個結果對10取模後再相乘,最終得到乙個數k。遊戲的要求是使你所得的k...

洛谷P1043數字遊戲

題目 區間dp,將 maxn i j k 表示為i到j區間內分為k個區間所得到的最大值,minn 表示最小值。然後可以得到狀態轉移方程 maxn i j k max maxn i j k maxn i l k 1 l到j的 10後的和 然後判斷一下邊界就能得到最終答案。c include using...

洛谷 P1043 數字遊戲

跟石子合併差不多,區間dp 環形 用f i j s 表示從i到j分成s段所能獲得的最大答案,列舉斷點k,則f i j s min f i j s f i k s 1 代價 最小值反之.ps 區間和用字首和維護.1 include2 include3 include4 5using namespace...