【蓝桥杯】 算法提高 和谐宿舍2 (动态规划)
问题描述
我的某室友学过素描,墙上有n张他的作品。这些作品都是宽度为1,高度不定的矩形,从左到右排成一排,且底边在同一水平线上。
宿舍评比就要来了,为了及格,我们决定买不多于m块的矩形木板,把这些作品和谐掉。要求木板也从左到右排成一排,且底边与作品的底边在同一水平线上。
在能够把所有作品和谐掉的前提下,我们希望这些木板的面积和最小,问最小面积和。
宿舍评比就要来了,为了及格,我们决定买不多于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 }