欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > P1854 [IOI1999] 花店橱窗布置

P1854 [IOI1999] 花店橱窗布置

2025/6/21 22:01:33 来源:https://blog.csdn.net/zqystca/article/details/148754114  浏览:    关键词:P1854 [IOI1999] 花店橱窗布置

P1854 [IOI1999] 花店橱窗布置 - 洛谷

题目描述

某花店现有 F 束花,每一束花的品种都不一样。至少有同样数量的花瓶,被按顺序摆成一行。花瓶的位置是固定的,从左到右按 1∼V 顺序编号,V 是花瓶的数目。

花束可以移动,并且每束花用 1∼F 的整数标识。所有花束在放入花瓶时必须保持其标识数的顺序。例如,假设杜鹃花的标识数为 1,秋海棠的标识数为 2,康乃馨的标识数为 3,即杜鹃花必须放在秋海棠左边的花瓶中,秋海棠必须放在康乃馨左边的花瓶中。每个花瓶只能放一束花。

每个花瓶的形状和颜色也不相同,因此,当各个花瓶中放入不同的花束时,会产生不同的美学效果,并以美学值(一个整数 aij​)来表示,空置花瓶的美学值为 0。在上述的例子中,花瓶与花束的不同搭配所具有的美学值,可以用如下的表格来表示:

花瓶花瓶1花瓶2花瓶3花瓶4花瓶5
杜鹃花723-5-2416
秋海棠521-41023
康乃馨-215-4-2020

根据表格,杜鹃花放在花瓶2中,会显得非常好看,但若放在花瓶4中,则显得很难看。

为了取得最佳的美学效果,必须在保持花束顺序的前提下,使花的摆放取得最大的美学值,如果具有最大美学值的摆放方式不止一种,则输出任一种方案即可。

输入格式

输入文件的第一行是两个整数 F 和 V,分别为花束数和花瓶数。

接下来是矩阵 aij​,共 F 行,每行 V 个整数,aij​ 表示花束 i 摆放在花瓶 j 中的美学值。

输出格式

输出文件的第一行是一个整数,为最大的美学值;接下来一行 F 个整数,为那束花放入那个花瓶的编号。

输入输出样例

输入 #1
3 5
7 23 -5 -24 16
5 21 -4 10 23
-21 5 -4 -20 20
输出 #1
3 5
7 23 -5 -24 16
5 21 -4 10 23
-21 5 -4 -20 20

说明/提示

对于 100% 的数据,1≤F≤V≤100。

感谢 @罗恺 提供 SPJ

思路:
代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 105;
int f[maxn][maxn];
int n,m;
int cost[maxn][maxn];
struct node
{int a[maxn];int tail;
} way[maxn][maxn]; // 记录路径int main()
{// 使用 -0x3f3f3f3f 初始化负无穷memset(f, -0x3f, sizeof(f));  cin>>n>>m;for(int i=1; i<=n; i++)for(int j=1; j<=m; j++)cin>>cost[i][j];for(int i=0; i<=m; i++)f[0][i]=0;for(int i=1; i<=n; i++) {for(int j=i; j<=m; j++) {// 枚举第i束花放入的花瓶kfor(int k = i; k <= j ; k++) {if(f[i-1][k-1] + cost[i][k] > f[i][j]) {way[i][j] = way[i-1][k-1];way[i][j].a[++way[i][j].tail] = k;f[i][j] = f[i-1][k-1] + cost[i][k];}}}}cout<<f[n][m]<<endl;for(int i = 1 ; i <= way[n][m].tail ; i++) {cout<< way[n][m].a[i]<<" ";}return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词