luogu 1043 數字遊戲(區間dp)

2021-08-17 12:44:17 字數 1216 閱讀 1642

題目描述

丁丁最近沉迷於乙個數字遊戲之中。這個遊戲看似簡單,但丁丁在研究了許多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數(一共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 2

4 3

-1 2

輸出樣例#1:

7 81

這個真的超級坑啊,取mod和c++裡的取餘不一樣,仔細讀題的話,可以發現結果加10就可以了

fmin ,fmax分別表示最大和最小 fmin||fmax[i][j][k]表示i~j區間切成k塊的答案

使用了乙個字首和來求答案

四重迴圈分別列舉 切割成的塊數,左端點,右端點,中間切的那一刀

注意好邊界條件 還有最後計數是i+n1-1

#include

#include

#define inf 0x7fffffff

inline

int work(int x)

inline

int max(int x,int y)

inline

int min(int x,int y)

int ans1=0,ans2=inf;

for (int i=1;i<=n1;++i) ans1=max(fmax[i][i+n1-1][m],ans1),ans2=min(fmin[i][i+n1-1][m],ans2);

printf("%d\n%d",ans2,ans1);

return

0;}

P1043 數字遊戲(區間dp )

思路 因為要求分為k個區間,所以依次列舉將區間分為k個,然後列舉左右區間,求出區間的最大,最小值。注意 陣列開兩倍。include using namespace std typedef long long ll const int n 105 ll dp 2 n n n a n const ll ...

洛谷 P1043 數字遊戲 區間DP

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

洛谷1043 數字遊戲

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