丁丁最近沉迷於乙個數字遊戲之中。這個遊戲看似簡單,但丁丁在研究了許多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數(一共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
複製
7$dpmin[i][j][k]$表示$i$到$j$中切了$k$次的最小值81
$dpmax$表示最大值
轉移的時候列舉斷點
左右兩邊相乘
#include#include#include
using
namespace
std;
const
int maxn=2001
;const
int inf=0x7fffff
;inline
char
nc()
inline
intread()
while(c>='
0'&&c<='9')
return x*f;
}int dpmin[101][101][11
];int dpmax[101][101][11
];int
a[maxn];
int query(int
a)int
main()
int ansmax=0,ansmin=inf;
for(int i=1;i<=n;i++)
ansmax=max(ansmax,dpmax[i][i+n-1
][m]),
ansmin=min(ansmin,dpmin[i][i+n-1
][m]);
printf(
"%d\n%d
",ansmin,ansmax);
return0;
}
洛谷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...
洛谷P1043 數字遊戲
題意將n個數排位環狀,將其分為 k個部分,k個部分 對 10 取模 然後累乘起來,求其最大和最小的值 動態規劃 用 f i j k 表示將 i j這幾個數 分為 k個部分 能夠取到的最大值 可知狀態轉移方程 f i j k max f i j k f i l 1 k 1 c j c l 1 c 表示...