Java实现 蓝桥杯 算法提高 和谐宿舍2

试题 算法提高 和谐宿舍2

资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
  我的某室友学过素描,墙上有n张他的作品。这些作品都是宽度为1,高度不定的矩形,从左到右排成一排,且底边在同一水平线上。
  宿舍评比就要来了,为了及格,我们决定买不多于m块的矩形木板,把这些作品和谐掉。要求木板也从左到右排成一排,且底边与作品的底边在同一水平线上。
  在能够把所有作品和谐掉的前提下,我们希望这些木板的面积和最小,问最小面积和。

在这里插入图片描述

输入格式
  第一行两个数n和m,表示作品数和木板数;
  第二行n个数Hi,表示从左到右第i个作品的高度。
输出格式
  一行一个数ans,表示答案。
样例输入
5 2
4 2 3 5 4
样例输出
22
数据规模和约定
  对于30%的数据:1<=n,m<=10;
  对于100%的数据:1<=n,m<=100,1<=Hi<=10000。

package com.company;

import java.util.Scanner;

public class 和谐宿舍2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int [] heights = new int[n+1];
        for (int i=1;i<=n;i++){
            heights[i]=sc.nextInt();
        }
        sc.close();
        int  [][] max_height = new int[n+1][n+1];
        int [] [] f = new int[n+1][m+1];
        //max_height[i][i]是i~j最高的高度
        for (int i=1;i<=n;i++){
            max_height[i][i]=heights[i];
            for (int j=i+1;j<=n;j++){
                max_height[i][j]=Math.max(max_height[i][j-1],heights[j]);
            }
        }
        for (int i=1;i<=n;i++){
            //前i个作品的第一个组,(第一个组为前i个商品)
            f[i][1]=i*max_height[1][i];
            for (int j=2;j<=i && j<=m;j++){
                f[i][j]=Integer.MAX_VALUE;
                //k的取值范围是总数减去当前的组数+1    前面一个组最少占了一个作品
                for (int k=1;k<=i-j+1;k++){//   当前的j-1(上一个组)就是前i-k个作品       后面就是i-k+1到第i个最高的*他们的宽度k(宽度是1,k为个数)
                    f[i][j]=Math.min(f[i][j],    f[i-k][j-1]+k                   *      max_height[i-k+1][i]);
                }
//                System.out.print(f[i][j]+" ");
            }
//            System.out.println();
        }
        System.out.println(f[n][m]);

    }
}

posted @ 2020-02-11 13:04  南墙1  阅读(52)  评论(0编辑  收藏  举报