一.
状态表示:设Min[i][j]代表从第i堆石子到第j堆石子合并的最小花费,通常的,i=1,j=n是我们的最终目标。过渡阶段,Min[i][k]代表从第i堆石子到第k堆石子合并的最小花费,Min[k+1][j]代表从第k+1堆石子到第j堆石子合并的最小花费。w ( i, j )为 i 对到 j 堆石子的数量之和。规定i<=k<j
递归子式子如下:
Min [ i ] [ j ] = 0 (i = j)
Min [ i ] [ j ] = min ( Min [ i ] [ j ], Min [ i ] [ k ] + Min [ k + 1 ] [ j ] + w ( i , j ), i < j ( i <= k < j )
边界条件:
每层循环小于数组长度,大于等于则终止循环
时间复杂度:O ( n^3 )
空间复杂度:O ( n^2 )
public static void main(String[] args){
int[][] f = new int[5][5];
int[] s = new int[5];
Scanner input = new Scanner(System.in);
int n = input.nextInt();
for (int i = 1; i <= n; i++) {
s[i] = input.nextInt();
s[i] += s[i-1];
}
for(int len = 1; len < n; len++){
for(int i = 1; i + len <= n; i++){
int l = i, r = i + len;
f[l][r] = 9999;
for(int k = l; k < r; k++){
f[l][r] = Math.min(f[l][r], f[l][k] + f[k+1][r] + s[r] - s[l-1]);
}
}
}
System.out.println(f[1][n]);
}
二. 动态规划收获与感想
动态规划策略是一种全局观,要思前想后,每一次的填表都要根据当下的状况结合题目继续修改。最重要的是要列出正确的递归式子。