【蓝桥杯】 算法提高 和谐宿舍2 (动态规划)

问题描述
  我的某室友学过素描,墙上有n张他的作品。这些作品都是宽度为1,高度不定的矩形,从左到右排成一排,且底边在同一水平线上。
  宿舍评比就要来了,为了及格,我们决定买不多于m块的矩形木板,把这些作品和谐掉。要求木板也从左到右排成一排,且底边与作品的底边在同一水平线上。
  在能够把所有作品和谐掉的前提下,我们希望这些木板的面积和最小,问最小面积和。
 1 #include <stdio.h>
 2 #include <cstring>
 3 #include <string.h>
 4 #include <iostream>
 5 int a[103];
 6 int picMax[103][103]={0};
 7 int dp[103][103] = {0};
 8 using namespace std;
 9 const int INF = 0X7F7F7F7F;  //定义的无穷大
10 int main(){
11     //freopen("in.txt","r",stdin);
12     int n,m;
13     cin>>n>>m;
14     memset(dp, INF, sizeof(dp));
15     for(int i = 1;i<=n;i++){
16         cin>>a[i];
17     }
18     for(int i =1;i<=n;i++){
19         for(int j=i;j<=n;j++){
20             picMax[i][j] = max(picMax[i][j-1],a[j]); //求最高的 
21         } 
22     }
23     for(int i = 1;i<=n;i++){//每幅画 
24         dp[i][1] = i*picMax[1][i];
25         for(int j=2;j<=m;j++){//每块板子 
26             for(int k=1;k<=i-j+1;k++){
27                 dp[i][j] = min(dp[i][j],dp[i-k][j-1]+k*picMax[i-k+1][i]);
28             }
29         }
30     }
31     cout<<dp[n][m]<<endl;
32     return 0;
33 }

 

posted @ 2020-05-13 13:49  清谗  阅读(466)  评论(0编辑  收藏  举报