題目描述 description
丁丁最近沉迷於乙個數字遊戲之中。這個遊戲看似簡單,但丁丁在研究了許多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數(一共n個),你要按順序將其分為m個部分,各部分內的數字相加,相加所得的m個結果對10取模後再相乘,最終得到乙個數k。遊戲的要求是使你所得的k最大或者最小。
例如,對於下面這圈數字(n=4,m=2):
4 -1
當要求最小值時,((2-1) mod 10)×((4+3) mod 10)=1×7=7,要求最大值時,為((2+4+3) mod 10)×(-1 mod 10)=9×9=81。特別值得注意的是,無論是負數還是正數,對10取模的結果均為非負值。
丁丁請你編寫程式幫他贏得這個遊戲。
輸入描述 input description
輸入檔案第一行有兩個整數,n(1≤n≤50)和m(1≤m≤9)。以下n行每行有個整數,其絕對值不大於104,按順序給出圈中的數字,首尾相接。
輸出描述 output description
輸出檔案有兩行,各包含乙個非負整數。第一行是你程式得到的最小值,第二行是最大值。
樣例輸入 sample input
4 2-1
樣例輸出 sample output
資料範圍及提示 data size & hint
en
/*view code劃分形dp
f[i][j][k]表示i~j分成k個部分的最大(小)值
先預處理出sum[i][j]表示i~j在模10條件下的和
轉移方程:
fmax[i][j][k]=max(fmax[i][p][k-1]*sum[p+1][j])
fmin[i][j][k]=min(fmin[i][p][k-1]*sum[p+1][j])
*/#include
#include
#define m 110
#define n 11
#define inf 9999999
using
namespace
std;
intfmax[m][m][n],fmin[m][m][n],sum[m][m],a[m];
intmain()
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
//狀態轉移
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
for(int k=2;k<=m;k++)
for(int p=i;p)
//求出答案
int minn=inf,maxn=-inf;
n/=2
;
for(int i=1;i<=n;i++)
printf(
"%d\n%d
",minn,maxn);
return0;
}
codevs 1085 數字遊戲
codevs 1085 數字遊戲 題目大意 在你面前有一圈整數 一共n個 你要按順序將其分為m個部分,各部分內的數字相加,相加所得的m個結果對10取模後再相乘,最終得到乙個數k。遊戲的要求是使你所得的k最大或者最小。dp i j k 表示i到j分成k個部分的最大值 dp i j k max 注意先將...
1085 數字遊戲
2003年noip全國聯賽普及組 時間限制 1 s 空間限制 128000 kb 題目等級 gold 丁丁最近沉迷於乙個數字遊戲之中。這個遊戲看似簡單,但丁丁在研究了許多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數 一共n個 你要按順序將其分為m個部分...
1085 數字遊戲
2003年noip全國聯賽普及組 時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解丁丁最近沉迷於乙個數字遊戲之中。這個遊戲看似簡單,但丁丁在研究了許多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數 一共n個 你要按順序將其分為m個...