Vijos 1218 數字遊戲

2022-08-17 09:12:17 字數 1152 閱讀 5262

給出n個數圍成乙個環,將其劃分成k個部分,每個部分求和再對10取模,最後將每個部分的值相乘,求其最大值與最小值.

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

輸入檔案第一行有兩個整數,n(1≤n≤50)和m(1≤m≤9)。以下n行每行有個整數,其絕對值不大於104,按順序給出圈中的數字,首尾相接。

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

4 243

-12

7

81

各個測試點1s

dp!^_^

簡單的劃分型dp.轉移方程:

dp[i][k]=max.

注意:1.取模.

2.初始化.

1 #include 2

using

namespace

std;34

const

int maxn=50+5,maxk=10+5,inf=0x7fffffff;5

6int

n,k,ans1,ans2;

7int s[maxn<<1];8

intdp1[maxn][maxk],dp2[maxn][maxk];910

int num(int x)

11void

solve()22}

23 ans1=min(ans1,dp1[n][k]);

24 ans2=max(ans2,dp2[n][k]);25}

26 printf("

%d\n%d\n

",ans1,ans2);27}

28void

init()

34for(int i=n+1;i<=2*n;i++) s[i]=s[n]+s[i-n];35}

36int

main()

view code

Vijos 1218 數字遊戲

演算法 環形dp 劃分型dp 環形dp的思路很簡單,將1 n中每乙個節點當成起點進行劃分型dp即可,關於劃分型dp前面 有介紹 查詢tag把 sxbk!sxbk。此題那麼水卡了我3個小時。到頭來發現是初始化。但我也學到了不少東西 define oo unsigned long long 0 1 替代...

1218 取石子遊戲

題目 有兩堆石子,兩個人輪流去取。每次取的時候,只能從較多的那堆石子裡取,並且取的數目必須是較少的那堆石子數目的整數倍,最後誰能夠把一堆石子取空誰就算贏。比如初始的時候兩堆石子的數目是25和7。25 7 11 7 4 7 4 3 1 3 1 0選手1取 選手2取 選手1取 選手2取 選手1取 最後選...

1218 取石子遊戲

1218 取石子遊戲 時間限制 1000 ms 記憶體限制 65536 kb 提交數 4462 通過數 2049 題目描述 有兩堆石子,兩個人輪流去取。每次取的時候,只能從較多的那堆石子裡取,並且取的數目必須是較少的那堆石子數目的整數倍,最後誰能夠把一堆石子取空誰就算贏。比如初始的時候兩堆石子的數目...