1105. 填充书架
Posted lixycc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1105. 填充书架相关的知识,希望对你有一定的参考价值。
题目链接:1105. 填充书架
方法一:记忆化搜索
解题思路
- \\(dfs(i)\\):从 \\(i\\) 到 \\(n - 1\\) 书放置的最小高度总和;
- 对于每一层:枚举当前层放置从 \\(i\\) 开始的书,放置几本时整体的高度最优,按题目要求,必须是从 \\(i\\) 开始的连续几本书,当前层的高度取最优方案中书的最高值;
- 返回 \\(dfs(0)\\)。
代码
class Solution
public:
int minHeightShelves(vector<vector<int>>& books, int shelfWidth)
const int n = books.size();
int cache[n]; memset(cache, -1, sizeof(cache));
function<int(int)> dfs = [&](int i) -> int
if (i == n) return 0;
if (cache[i] != -1) return cache[i];
int &res = cache[i], width = shelfWidth, high = 0;
res = INT_MAX;
for (int j = i; j < n; j ++ ) // 枚举
if (width < books[j][0]) break;
width -= books[j][0];
high = max(high, books[j][1]);
res = min(res, dfs(j + 1) + high); // 递归到下一层,取所有方案的最小值
return res;
;
return dfs(0);
;
复杂度分析
时间复杂度:\\(O(n^2)\\);
空间复杂度:\\(O(n)\\)。
方法二:动态规划
解题思路
将记忆化 => 动态规划
代码
class Solution
public:
int minHeightShelves(vector<vector<int>>& books, int shelfWidth)
int n = books.size();
int dp[n + 1]; dp[n] = 0;
for (int i = n - 1; i >= 0; i -- )
int width = shelfWidth, high = 0;
dp[i] = INT_MAX;
for (int j = i; j < n; j ++ )
if (width < books[j][0]) break;
width -= books[j][0];
high = max(high, books[j][1]);
dp[i] = min(dp[i], dp[j + 1] + high); // 求当前层为 [i, j],先前所有层为 [j + 1, n - 1] 为最优方案的 j
return dp[0];
;
复杂度分析
时间复杂度:\\(O(n^2)\\);
空间复杂度:\\(O(n)\\)。
1029. 整理书架
Description
二哥又要整理书架了。他整理书架的方法很简单,把书架上一排所有的书全部挪到另一排的后面。现在二哥把它整理的顺序告诉你,你来告诉他整理之后的书架是什么样子的。
Input Format
读入一个数 n≤100
,表示书架一共有n排,接下来有n行,每行有一些数字(不多于100个数),每个数字代表一本书,每一行表述这一排书架上的书。再下来有n-1个数对,数对x,y表示把第x排的书放到第y排的后面。
Output Format
输出只有一行,输出最后一排的所有书。
Sample Input
3
1 2 3
4 5
6 7
3 1
2 1
Sample Output
1 2 3 6 7 4 5
#include <iostream>
#include <stdio.h>
#include <queue>
using namespace std;
int main() {
int n;
cin>>n;
vector<queue<int> > bookrack;
for(int i=0;i<=n;i++){
queue<int> q;
char c;
int j=1;
while((c=getchar())!=‘\n‘){
if(c>=‘0‘ && c<=‘9‘){
int a;
ungetc(c,stdin);
cin>>a;
q.push(a);
}
}
bookrack.push_back(q);
}
int ope[n-1][2];
//cout<<n-1<<endl;
for(int i=0;i<n-1;i++){
int a,b;
cin>>a>>b;
ope[i][0] = a;
ope[i][1] = b;
}
for(int op = 0; op< n-1; op++){
int fr = ope[op][0], to = ope[op][1];
while(!bookrack[fr].empty()){
bookrack[to].push(bookrack[fr].front());
bookrack[fr].pop();
}
}
for(int i = 0; i<bookrack.size();i++){
while(!bookrack[i].empty()){
cout<<bookrack[i].front()<<" ";
bookrack[i].pop();
}
}
return 0;
}
以上是关于1105. 填充书架的主要内容,如果未能解决你的问题,请参考以下文章
PAT A1105 Spiral Matrix [硬核模拟]