丁丁最近沉迷於乙個數字遊戲之中。這個遊戲看似簡單,但丁丁在研究了許多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數(一共n個),你要按順序將其分為m個部分,各部分內的數字相加,相加所得的m個結果對10取模後再相乘,最終得到乙個數k。遊戲的要求是使你所得的k最大或者最小。
例如,對於下面這圈數字(n=4,m=2):
要求最小值時,((2-1) mod 10)×((4+3) mod 10)=1×7=7,要求最大值時,為((2+4+3) mod 10)×(-1 mod 10)=9×9=81。特別值得注意的是,無論是負數還是正數,對10取模的結果均為非負值。
丁丁請你編寫程式幫他贏得這個遊戲。
輸入格式:
輸入檔案第一行有兩個整數,n(1≤n≤50)和m(1≤m≤9)。以下n行每行有個整數,其絕對值不大於104,按順序給出圈中的數字,首尾相接。
輸出格式:
輸出檔案有兩行,各包含乙個非負整數。第一行是你程式得到的最小值,第二行是最大值。
輸入樣例#1:
4 243輸出樣例#1:-12
781區間dp(蒟蒻我第一眼還想用搜尋)
f[i][j] 代表前i個數分成了j份的最大值
g[i][j] 則為最小值
轉移並不難想 f[i][j] 一定由f[k][j-1] 轉移而來
k為某一斷點
g[i][j]同理
和用字首和來表示 降低複雜度
1 #include 2 #include 3**4const
int maxn=210;5
const
int inf=0x3f3f3f3f;6
7int
n,k,mx,mn;89
intsum[maxn],f[maxn][maxn],g[maxn][maxn],a[maxn];
1011 inline void read(int&x)
1718 inline int max(int a,int
b) 21
22 inline int min(int a,int
b) 25
26 inline void dp(int*e)
3940 mx=max(mx,f[n][k]);
41 mn=min(mn,g[n][k]);
42return;43
}4445int
hh()
5354
int sb=hh();
55int main()
P1043 數字遊戲
丁丁最近沉迷於乙個數字遊戲之中。這個遊戲看似簡單,但丁丁在研究了許多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數 一共n個 你要按順序將其分為m個部分,各部分內的數字相加,相加所得的m個結果對10取模後再相乘,最終得到乙個數k。遊戲的要求是使你所得的k...
P1043 數字遊戲
給乙個由 n nn 個數組成的環,講環拆成 m mm 份,每份求和最後相乘,求最大 最小值。一道區間 dpdp dp題,首先因為是環,常規做法就是拆環,用兩倍數組裝,又要對每份求和,那就需要用到字首和。陣列 dp i j dp i j dp i j 表示將 j jj 個數分成 i ii 份的最大 最...
P1043 數字遊戲
研究環狀dp 可以開雙倍大小的陣列用以表示環 表示為 f i j l 從i 到 l 的區間裡,劃分 l 段 進行遞推前,需要初始化 f i j 1 然後有乙個小細節就是sum 進行字首和優化 將 o n 的東西優化成 o 1 可以加快節奏 讀取最值時記得掃一遍環 f i i n 1 i 1 n 狀態...