POJ3486电脑.java 1.7 KB
Newer Older
qq_36480062's avatar
c  
qq_36480062 已提交
1 2 3 4 5
package dp.线性dp;

import java.util.Arrays;
import java.util.Scanner;

qq_36480062's avatar
c  
qq_36480062 已提交
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
/**
 * 线性dp是指阶段,状态的排布,是线性的
 * https://blog.csdn.net/azheng51714/article/details/8498041
 * https://blog.csdn.net/u012860063/article/details/40477059?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4.nonecase
 * 根据时间划分阶段
 * f[i]表示知道第i年的最小花费
 * 假设上一次买电脑是第j年,
 * 那么1~j-1年就是子问题,我们有f[i-1]的满足子问题的最优解,
 * 我们就不用考虑前j-1年的情况,第j年到第i年的维修费用为m(j,i)花费c
 * 所以可以用f[j-1]+m(i,j)+c来更新f[i]
 * f[i]=min{ f[j-1]+m(i,j)+c | 1<=j<=i }
 * <p>
 * 3
 * 3
 * 5 7 50
 * 6 8
 * 10
 * Sample Output
 * <p>
 * 19
 */
qq_36480062's avatar
c  
qq_36480062 已提交
27 28 29
public class POJ3486电脑 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
qq_36480062's avatar
c  
qq_36480062 已提交
30 31 32 33 34 35 36
        while (sc.hasNext()) {
            n = sc.nextInt();
            c = sc.nextInt();
            for (int i = 1; i <= n; i++) {
                for (int j = i; j <= n; j++) {
                    m[i][j] = sc.nextInt();
                }
qq_36480062's avatar
c  
qq_36480062 已提交
37
            }
qq_36480062's avatar
c  
qq_36480062 已提交
38
            get();
qq_36480062's avatar
c  
qq_36480062 已提交
39
        }
qq_36480062's avatar
c  
qq_36480062 已提交
40 41 42 43
    }

    static void get() {

qq_36480062's avatar
c  
qq_36480062 已提交
44 45
        Arrays.fill(f, Integer.MAX_VALUE / 2);
        f[0] = 0;
qq_36480062's avatar
c  
qq_36480062 已提交
46 47
//        f[1] = m[1][1] + c;
        for (int i = 1; i <= n; i++) {
qq_36480062's avatar
c  
qq_36480062 已提交
48 49 50 51 52 53 54 55 56 57 58
            for (int j = 1; j <= i; j++) {
                f[i] = Math.min(f[i], f[j - 1] + m[j][i] + c);
            }
        }
        System.out.println(f[n]);
    }

    static int n, c;
    static int[] f = new int[1000];
    static int[][] m = new int[1000][1000];
}