区间DP的经典问题,
f
[
i
]
[
j
]
f[i][j]
f[i][j]表示把
[
i
.
.
.
j
]
[i...j]
[i...j]之间的石子合并成一堆的最小代价
动态转移方程
f
[
i
]
[
j
]
=
m
i
n
(
f
[
i
]
[
j
]
,
f
[
i
]
[
k
]
+
f
[
k
+
1
]
[
j
]
+
s
u
m
[
i
.
.
.
j
]
)
f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+sum[i...j])
f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+sum[i...j])
classMain{publicstaticvoidmain(String[] args){Scanner in =newScanner(System.in);int n = in.nextInt();int[] stones =newint[n];int[] sum =newint[n +1];for(int i =1; i <= n; i++){
stones[i -1]= in.nextInt();
sum[i]= sum[i -1]+ stones[i -1];}int[][] f =newint[n +1][n +1];for(int len =2; len <= n; len++){for(int i =1; i + len -1<= n; i++){int j = i + len -1;
f[i][j]=Integer.MAX_VALUE;for(int k = i; k < j; k++){
f[i][j]=Math.min(f[i][j], f[i][k]+ f[k +1][j]+ sum[j]- sum[i -1]);}}}System.out.println(f[1][n]);}