題幹 (沒錯就是它)好吧,因為有n個整數,要按順序將其(劃重點了!!!)分為m個部分,所以就是要分為m個區間,這自然就是區間dp了。 dfs也行…
好了,具體區間dp dfs呢? 的做法如下:
先來兩個超級無敵dp方程:
讀入 & 將它*2拆成鏈狀f[i]
[j][l]
=max
(f[i]
[j][l]
,f[i]
[k][l-1]
*(((b[j]
-b[k])%
10+10)
%10))
;g[i]
[j][l]
=min
(g[i]
[j][l]
,g[i]
[k][l-1]
*(((b[j]
-b[k])%
10+10)
%10))
;
求字首和 & 初始化陣列
區間dp,具體思路如下:
找出最大值與最小值 & 輸出l 正序列舉區間的數量
i 正序列舉區間的起點
j 正序列舉區間的終點
k 正序列舉區間的斷點
f 陣列存最大值
g 陣列存最小值
b 陣列是字首和
for(
int l=
2;l<=m;l++)}
}}
#include
using
namespace std;
int n,m,a[
1001
],b[
1001
],f[
101]
[101][
101]
,g[101][
101]
[101
],ans1=int_max,ans2;
intmain()
for(
int i=
1;i<=
2*n;i++
) b[i]
=b[i-1]
+a[i]
;for
(int i=
1;i<=
2*n;i++
)for
(int j=i;j<=
2*n;j++
) f[i]
[j][1]
=g[i]
[j][1]
=((b[j]
-b[i-1]
)%10+
10)%10
;//初始化,無論大小在區間為 1時都只有一種情況
for(
int i=
2;i<=m;i++
)//找整整兩天才找到,i的起點是2
for(
int j=
1;j<=
2*n;j++
)for
(int k=i+j-
1;k<=
2*n;k++
) g[j]
[k][i]
=ans1;
//順序!!!
for(
int l=
2;l<=m;l++)}
}}for(
int i=
1;i<=n;i++
)printf
("%d\n%d\n"
,ans1,ans2)
;return0;
}
數字遊戲 NOIp普及組 2003 普及 提高
數字遊戲 題目描述 丁丁最近沉迷於乙個數字遊戲之中。這個遊戲看似簡單,但丁丁在研究了許多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數 一共nn個 你要按順序將其分為mm個部分,各部分內的數字相加,相加所得的mm個結果對1010取模後再相乘,最終得到乙個...
NOIP 2002 普及組 數字遊戲
題目鏈結 題目分析 這道題是一道區間dp題,跟能量項鍊還有石子合併差不多,我們用f i j l 表示處理i到j這一區間分為l段所能得到的最大值或是最小值。具體看 程式 include include include include include using namespace std int n,...
數字遊戲 noip2003普及組
題目描述 丁丁最近沉迷於乙個數字遊戲之中。這個遊戲看似簡單,但丁丁在研究了許多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數 一共n個 你要按順序將其分為m個部分,各部分內的數字相加,相加所得的m個結果對10取模後再相乘,最終得到乙個數k。遊戲的要求是使...