數字遊戲 NOIp普及組 2003 普及 提高

2021-08-29 20:23:28 字數 3445 閱讀 6319

數字遊戲

題目描述

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

例如,對於下面這圈數字(n=4,m=2n=4,m=2):

要求最小值時,((2-1) \bmod 10)×((4+3) \bmod 10)=1×7=7((2−1)mod10)×((4+3)mod10)=1×7=7,要求最大值時,為((2+4+3) \bmod 10)×(-1 \bmod 10)=9×9=81((2+4+3)mod10)×(−1mod10)=9×9=81。特別值得注意的是,無論是負數還是正數,對1010取模的結果均為非負值。

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

輸入輸出格式

輸入格式:

輸入檔案第一行有兩個整數,n(1≤n≤50)n(1≤n≤50)和m(1≤m≤9)m(1≤m≤9)。以下nn行每行有個整數,其絕對值x

xx滿足 x≤1

04≤1

04x \le 10^4 \le 10^4

x≤104≤

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

輸出格式:

輸出檔案有22行,各包含11個非負整數。第11行是你程式得到的最小值,第22行是最大值。

輸入輸出樣例

輸入樣例#1:

4 243

-12

輸出樣例#1:

7

81

但是還是要破環成鏈,所以空間複雜度:o (2

n2m)

o(2n^2m)

o(2n2m

)顯而易見地,時間複雜度:

o (4

n2m2

)o(4n^2m^2)

o(4n2m

2)

#include

using

namespace std;

struct dp

f[100][

100][10

];int n,m,a[

202]

,x,maxans =

0,minans =

0x3f3f3f3f

;int

main()

for(

int i =

1;i <=

2* n;i++

) a[i]

+= a[i -1]

;for

(int i =

1;i <=

2* n;i++

)for

(int j = i;j <=

2* n;j++

) f[i]

[j][1]

.maxn =

((a[j]

- a[i -1]

)%10+

10)%10

;for

(int i =

1;i <=

2* n;i++

)for

(int j = i;j <=

2* n;j++

) f[i]

[j][1]

.minn =

((a[j]

- a[i -1]

)%10+

10)%10

;for

(int i =

2;i <= m;i++

)for

(int l =

1;l <=

2* n;l++

)for

(int r = l + i -

1;r <=

2* n;r++

) f[l]

[r][i]

.maxn =

0x3f3f3f3f

;for

(int i =

2;i <= m;i++

)for

(int l =

1;l <=

2* n;l++

)for

(int r = l + i -

1;r <=

2* n;r++

) f[l]

[r][i]

.minn =

0x3f3f3f3f

;for

(int i =

2;i <= m;i++

)for

(int l =

1;l <=

2* n;l++

)for

(int r = l + i -

1;r <=

2* n;r++

)for

(int k = l + i -

2;k < r;k++

) f[l]

[r][i]

.maxn =

max(f[l]

[r][i]

.maxn,

(f[l]

[k][i -1]

.maxn *

(a[r]

- a[k])%

10+10)

%10);

for(

int i =

2;i <= m;i++

)for

(int l =

1;l <=

2* n;l++

)for

(int r = l + i -

1;r <=

2* n;r++

)for

(int k = l + i -

2;k < r;k++

) f[l]

[r][i]

.minn =

min(f[l]

[r][i]

.minn,

(f[l]

[k][i -1]

.minn *

(a[r]

- a[k])%

10+10)

%10);

for(

int i =

1;i <= n;i++

)printf

("%d\n%d"

,minans,maxans)

;return0;

}

數字遊戲 noip2003普及組

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

NOIP 2002 普及組 數字遊戲

題目鏈結 題目分析 這道題是一道區間dp題,跟能量項鍊還有石子合併差不多,我們用f i j l 表示處理i到j這一區間分為l段所能得到的最大值或是最小值。具體看 程式 include include include include include using namespace std int n,...

1923 03NOIP普及組 數字遊戲

題幹 沒錯就是它 好吧,因為有n個整數,要按順序將其 劃重點了 分為m個部分,所以就是要分為m個區間,這自然就是區間dp了。dfs也行 好了,具體區間dp dfs呢?的做法如下 先來兩個超級無敵dp方程 f i j l max f i j l f i k l 1 b j b k 10 10 10 g...