丁丁最近沉迷於乙個數字遊戲之中。這個遊戲看似簡單,但丁丁在研究了許多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數(一共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行每行有個整數,其絕對值不大於10410^410
4 ,按順序給出圈中的數字,首尾相接。
輸出格式:
輸出檔案有兩行,各包含乙個非負整數。第一行是你程式得到的最小值,第二行是最大值。
輸入樣例#1:
複製
4 243輸出樣例#1:-12
複製
781
分析
明顯的區間環形dp;
做法
先跟[noi2001合併石子]一樣,複製一下序列,斷環成鏈。 然後設dp[l,r,i] 為將區間[l,r] 分成i 個部分相乘的最優解,可以得出如下狀態轉移方程 dp[l,r,k]=max sum 用字首和來維護。
卡點
注意一下mod 運算和取餘運算不同,如果為負數則需要變成正數。
#include#includeusing namespace std;
int f[2][20][105][105];
int n,m;
int sum[105];
int main()
for(int i=1;i<=n<<1;i++)
sum[i]+=sum[i-1];
for(int i=1;i<=n;i++)
for(int j=i;j<=i+n-1;j++)
f[1][1][i][j]=f[0][1][i][j]=((sum[j]-sum[i-1])%10+10)%10;
for(int i=2;i<=m;i++)
for(int l=1;l<=n;l++)
for(int r=l+i-1;r
}int ans1=1e16,ans2=-1e16;
for(int i=1;i<=n;i++)
printf("%d\n%d\n",ans1,ans2);
return 0;
}
18 04 11 luoguP1043 數字遊戲
丁丁最近沉迷於乙個數字遊戲之中。這個遊戲看似簡單,但丁丁在研究了許多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數 一共n個 你要按順序將其分為m個部分,各部分內的數字相加,相加所得的m個結果對10取模後再相乘,最終得到乙個數k。遊戲的要求是使你所得的k...
洛谷1043 數字遊戲
洛谷1043 數字遊戲 題目描述 丁丁最近沉迷於乙個數字遊戲之中。這個遊戲看似簡單,但丁丁在研究了許多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數 一共n個 你要按順序將其分為m個部分,各部分內的數字相加,相加所得的m個結果對10取模後再相乘,最終得到...
P1043 數字遊戲
丁丁最近沉迷於乙個數字遊戲之中。這個遊戲看似簡單,但丁丁在研究了許多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數 一共n個 你要按順序將其分為m個部分,各部分內的數字相加,相加所得的m個結果對10取模後再相乘,最終得到乙個數k。遊戲的要求是使你所得的k...