蓝桥杯 ADV-298 算法提高 和谐宿舍2 C++解题

蓝桥杯-试题ADV-298 算法提高 和谐宿舍2 C++解题

问题描述

       我的某室友学过素描,墙上有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。

个人分析

       题目属于动态规划类型,要求就是将几幅长条形的作品通过不同的相邻的组合方式,使得用来覆盖的矩形木板的面积和最小,毋庸置疑,这其实是由每个组合中最高的作品幅决定的。同时,一定是全部用满m块木板的方式,可以保证用到最少的面积。
       所以首先创造一个变量,求出i->j(两边闭区间)幅作品中,作品的最高高度,代码如下:

for (int i = 1; i <= n; i++)
		for (int j = i; j <= n; j++)
			topPicture[i][j] = max(topPicture[i][j-1],pictureHeight[j]);

       题目要求:最多共有m块木板,n幅作品,那么设dp[i][j],i代表着纳入组合分类的作品数,j代表着当前可用的木板数,设k为dp[i][j]状态下,可以组合的作品的数目。
       则状态转移方程为:状态转移方程:dp[i][j] = min(dp[i][j],dp[i-k][j-1]+k*topPicture[i-k+1][i])
       全部代码如下所示:

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

const int Max = 105;
const int INF = 0X7F7F7F7F;  //定义的无穷大

int dp[Max][Max];
int pictureHeight[Max] = { 0 };
int topPicture[Max][Max] = { 0 };  //记录i->j区间内,最高的作品高度

int main() {
	int m, n;  // m->木板数  n->作品数
 	memset(dp, INF, sizeof(dp));
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		cin >> pictureHeight[i];
	for (int i = 1; i <= n; i++)
		for (int j = i; j <= n; j++)
			topPicture[i][j] = max(topPicture[i][j-1],pictureHeight[j]);
	for (int i = 1; i <= n; i++) {   //遍历作品
		dp[i][1] = i * topPicture[1][i];
		for (int j = 2; j <= m; j++) {  //遍历木板数
			for (int k = 1; k <= i - j + 1; k++) {
				dp[i][j] = min(dp[i][j], dp[i - k][j - 1] + k * topPicture[i - k + 1][i]);
			}
		}
	} 
	cout << dp[n][m];
	return 0;
}
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值