当前位置:网站首页>信息学奥赛一本通 1279:【例9.23】橱窗布置(flower) | 洛谷 P1854 花店橱窗布置
信息学奥赛一本通 1279:【例9.23】橱窗布置(flower) | 洛谷 P1854 花店橱窗布置
2022-06-10 04:33:00 【君义_noip】
【题目链接】
ybt 1279:【例9.23】橱窗布置(flower)
洛谷 P1854 花店橱窗布置
吐槽:一本通中给的测试数据中,负号是全角负号!怪不得每次数据读不完程序就结束了。还是用洛谷的测试数据吧。
【题目考点】
1. 动态规划
【解题思路】
1. 状态定义
集合:摆花的方案
限制:选择前几束花,放在前几个瓶子中
属性:美学值
条件:最大
统计量:美学值
状态定义:dp[i][j]:将前i束花放入前j个瓶子中,美学值最大的方案的美学值。
初始状态:前0束花放入j个花瓶中,美学值为0。所以dp[0][j] = 0。
2. 状态转移方程
记将第i束花放入第j个瓶子得到的美学值为a[i][j]。
集合:将前i束花放入前j个瓶子
本题分割集合的方法有两种,因此状态转移方程也有两种。
解法1:
分割集合:根据将第i束花放入第几个瓶子来分割集合
- 如果把第i束花放入第j个瓶子,那么接下来需要把前i-1束花放入前j-1个瓶子中获得最大美学值。
dp[i][j] = dp[i-1][j-1] + a[i][j] - 如果把第i束花放入第j-1个瓶子,那么接下来需要把前i-1束花放入前j-2个瓶子中获得最大美学值。
dp[i][j] = dp[i-1][j-2] + a[i][j-1]
…如果把第i束花放入第i个瓶子,那么接下来需要把前i-1束花放入前i-1个瓶子中获得最大美学值。dp[i][j] = dp[i-1][i-1] + a[i][i] - 以上多种情况取最大值。
- 综上,k从i循环到j,
dp[i][j] = max(dp[i][j], dp[i-1][k-1] + a[i][k])
解法2:
分割集合:根据将第i束花是否放入第j瓶子来分割集合
- 如果把第i束花放入第j个瓶子,那么接下来需要把前i-1束花放入前j-1个瓶子中获得最大美学值。
dp[i][j] = dp[i-1][j-1] + a[i][j] - 如果不把第i束花放入第j瓶子,那么接下来需要把前i束花放入前j-1个瓶子中获得最大美学值。
dp[i][j] = dp[i][j-1] - 以上两种情况取最大值
3. 具体做法:
1. 瓶子编号j的循环范围
由于每束花都要放在某个花瓶中,前i束花放入前j个瓶子中,瓶子数量必须大于等于花的数量,所以 j ≥ i j \ge i j≥i。
一共有f束花v个瓶子,在前i束花放入前j个瓶子时,还剩下f-i束花,v-j个瓶子,剩下的瓶子的数量也一定要大于等于花的数量,因此 v − j ≥ f − i v-j \ge f-i v−j≥f−i,即 j ≤ v − f + i j \le v-f+i j≤v−f+i
所以j从i循环到v-f+i。
2. 记录方案
设数组b,b[i][j]表示如果将前i束花放入前j个瓶子,第i束花所在的瓶子。
如果确定将花放入第k瓶子能获得最大美学值,可以更新dp[i][j],那么也同时更新b[i][j] = k。
如果将前i束花放入前j个瓶子与放入前j-1个瓶子能获得的最大美学值一样,那么将前i束花放入前j个瓶子第i束花所在的瓶子,与将前i束花放入前j-1个瓶子第i束花所在的瓶子也是一样的,所以b[i][j] = b[i][j-1]。
输出时通过递归的方法逆序输出,前i束花放入前j个瓶子,第i束花在b[i][j],那么先输出前i-1束花放在前b[i][j]-1个瓶子中的情况,再输出b[i][j]。
3. 复杂度
方法2的时间复杂度稍优于方法1。由于f与v最多为 100 100 100, O ( n 2 ) O(n^2) O(n2)或 O ( n 3 ) O(n^3) O(n3)的复杂度都能过。
空间复杂度上,方法1可以做滚动数组优化,不过没有必要,输入数据和b数组都是 O ( n 2 ) O(n^2) O(n2)复杂度的,滚动数组优化后并不能减少整体的空间复杂度。
【题解代码】
解法1:三重循环
#include<bits/stdc++.h>
using namespace std;
#define N 105
int f, v, a[N][N], dp[N][N];//dp[i][j]:前i个束花放在前j个花瓶中能得到的最大美学度
int b[N][N];//b[i][j]:前i个花束放入前j个瓶子,第i束花在哪个瓶子
void show(int i, int j)//输出前i个花束放入前j个瓶子各花束的位置
{
if(i == 0)
return;
show(i-1, b[i][j]-1);
cout << b[i][j] << ' ';
}
int main()
{
cin >> f >> v;
for(int i = 1; i <= f; ++i)
for(int j = 1; j <= v; ++j)
cin >> a[i][j];
memset(dp, 0xc0, sizeof(dp));//初始化为负无穷
for(int j = 0; j <= v; ++j)
dp[0][j] = 0;
for(int i = 1; i <= f; ++i)
for(int j = i; j <= v-f+i; ++j)
for(int k = i; k <= j; ++k)
{
if(dp[i][j] < dp[i-1][k-1] + a[i][k])
{
dp[i][j] = dp[i-1][k-1] + a[i][k];
b[i][j] = k;
}
}
cout << dp[f][v] << endl;
show(f, v);
return 0;
}
解法2:二重循环
#include<bits/stdc++.h>
using namespace std;
#define N 105
int f, v, a[N][N], dp[N][N];//dp[i][j]:前i个束花放在前j个花瓶中能得到的最大美学度
int b[N][N];//b[i][j]:前i个花束放入前j个瓶子,第i束花在哪个瓶子
void show(int i, int j)//输出前i个花束放入前j个瓶子各花束的位置
{
if(i == 0)
return;
show(i-1, b[i][j]-1);
cout << b[i][j] << ' ';
}
int main()
{
cin >> f >> v;
for(int i = 1; i <= f; ++i)
for(int j = 1; j <= v; ++j)
cin >> a[i][j];
memset(dp, 0xc0, sizeof(dp));//初始化为负无穷
for(int j = 0; j <= v; ++j)
dp[0][j] = 0;
for(int i = 1; i <= f; ++i)
for(int j = i; j <= v-f+i; ++j)
{
if(dp[i][j-1] < dp[i-1][j-1]+a[i][j])
{
dp[i][j] = dp[i-1][j-1]+a[i][j];
b[i][j] = j;
}
else
{
dp[i][j] = dp[i][j-1];
b[i][j] = b[i][j-1];
}
}
cout << dp[f][v] << endl;
show(f, v);
return 0;
}
边栏推荐
- .NET C#基礎(7):接口 - 人如何和猫互動
- midway的使用教程
- 深度学习与CV教程(13) | 目标检测 (SSD,YOLO系列)
- Quic must see
- APISpace 日出日落API接口 免费好用
- [in depth study of 4g/5g/6g topic -28]: 5g NR startup process 4.6 - msg5 (rrcsetupcomplete) message scheduling
- Figure out the difference between firmware, driver and software
- JDBC 入門示例
- 90. locking
- Exemple de démarrage JDBC
猜你喜欢

mindspore1.6conda安装gpu版本验证失败

These programming languages are old and almost dead. Young people can't touch them

PySimpleGUI经典实践之:这个汉字怎么读?

Who ate IO?

Zero basic network: command line (CLI) debugging firewall practice

Crack the five myths of programmers, and new programmer 004 is officially launched!

Yyds dry goods inventory solution sword finger offer: rectangular coverage

Fastapi-15-file upload-3
![[science and technology specialty-1]: overview and advantages of science and Technology Specialty Students](/img/f6/77fda73053ed4afefc8277e196c1a9.png)
[science and technology specialty-1]: overview and advantages of science and Technology Specialty Students

Golang learning 6: file operation in
随机推荐
超好用的 Chrome 插件!
[Android L]SEAndroid增强Androd安全性背景概要及带来的影响
Final examination paper 2 of the first postgraduate course in Dialectics of nature
Celery | 任务队列神器
Acl2022 | the introduction of comparative learning to add negative samples to the generation process enables the model to effectively learn knowledge at different levels
Figure out the difference between firmware, driver and software
90. locking
Huawei, this is too strong
23 very useful shell scripts
深度学习与CV教程(13) | 目标检测 (SSD,YOLO系列)
MindSpore【初学入门】教程在线运行时报错
GUI programming student achievement management system
MindSpore【数据集功能】无法查看数据集
Cross in tensorflow_ entropy
Distributed data object: HyperTerminal 'global variable'
昇腾910上分布式加载模型与增量训练
Unit test with%unittest
Today, 19:30 | graphics special session - Gao Lin's team from Institute of computing technology, Chinese Academy of Sciences
Ammonium tech, a well-known network security hardware platform manufacturer, joined dragon lizard community
Super easy to use chrome plug-in!