洛谷1043 數字遊戲
題目描述
丁丁最近沉迷於乙個數字遊戲之中。這個遊戲看似簡單,但丁丁在研究了許多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數(一共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
2輸出樣例#1:
781
【思路】
環形dp + 劃分型dp。
題目的特殊性在於它是乙個環,我們已經處理過環形dp的問題了,把環拆成一條鏈就可以轉化為乙個線性的劃分dp。
注意:將環形dp拆開並且將拆開的點視為第一段與最後一段的相接處,而不是考慮拆開後的最後一段是否與第一段為同一段。
將元素重複一遍得長度n的鏈,列舉起點即列舉斷開處,對於每個起點求解長度為n劃分數為k的最大最小劃分,比較得出答案。
注意:dg的初始化為d[0][0]=g[0][0]=1;如果為d[1][1]=g[1][1]=a[s+1]則a值可能為負就出現了不合法的情況。
【**】
1 #include2 #include3 #include4#define for(a,b,c) for(int a=(b);a<=(c);a++)
5using
namespace
std;67
const
int maxn = 100+5;8
const
int inf=421075225;9
10int
d[maxn][maxn],g[maxn][maxn];
11int
sum[maxn],a[maxn],s[maxn][maxn];
12int n,n,m,ans_min=1
<<30
,ans_max;
1314 inline int calc(int i,int
j) 23
24int
main()
2531 n=2*n-1
;32 for(i,1,n) sum[i]=sum[i-1]+a[i] ;
3334 for(s,1,n-n)
3544
if(g[k][j-1]45 g[i][j]=min(g[i][j],g[k][j-1]*calc(s+k,s+i)); //
防止溢位 46}
47 ans_min=min(ans_min,g[n][m]);
48 ans_max=max(ans_max,d[n][m]);49}
50 printf("
%d\n%d
",ans_min,ans_max);
51return0;
52 }
洛谷P1043 數字遊戲
丁丁最近沉迷於乙個數字遊戲之中。這個遊戲看似簡單,但丁丁在研究了許多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數 一共n個 你要按順序將其分為m個部分,各部分內的數字相加,相加所得的m個結果對10取模後再相乘,最終得到乙個數k。遊戲的要求是使你所得的k...
洛谷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...