洛谷 P1043 數字遊戲 區間DP

2022-01-10 18:16:28 字數 1370 閱讀 6892

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

例如,對於下面這圈數字(n=4,m=2):

要求最小值時,((2−1)mod10)×((4+3)mod10)=1×7=7,要求最大值時,為((2+4+3)mod10)×(−1mod10)=9×9=81。特別值得注意的是,無論是負數還是正數,對10取模的結果均為非負值。

丁丁請你編寫程式幫他贏得這個遊戲。

輸入檔案第一行有兩個整數,n(1≤n≤50)和m(1≤m≤9)。以下n行每行有個整數,其絕對值 ≤\(10^4\),按順序給出圈中的數字,首尾相接。

輸出檔案有2行,各包含1個非負整數。第1行是你程式得到的最小值,第2行是最大值。

輸入 #1 複製

4 243-1

2輸出 #1 複製781

又是一道區間dp題

我們設\(f1[i][j][k]\)為將區間\([i,j]\)劃分為\(k\)段的最小花費

那麼就有\(f1[i][j][k]=min(f1[i][j][k],f1[i][c][k-1]*f1[c+1][j][1]);\)

其中尤其要注意\(k\)的範圍\([2,min(m,d)]\),\(c\)的範圍\([i+k-2,j)\)

如果範圍錯的話會出現爆\(long long\)的情況

\(f2\)最大花費的求法和\(f1\)完全相同

#includeusing namespace std;

typedef long long ll;

const int maxn=115;

ll f1[maxn][maxn][15],f2[maxn][maxn][15];

ll sum[maxn],a[maxn];

int main()

for(int i=1;i<=n*2;i++)

memset(f1,0x3f,sizeof(f1));

for(int i=1;i<=n*2;i++)

}for(int d=1;d<=n;d++)}}

}ll ans=0x3f3f3f3f3f3f3f3f;

ll ans1=-0x3f3f3f3f3f3f3f3f;

for(int i=1;i<=n;i++)

printf("%lld\n%lld\n",ans,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 數字遊戲

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