美文网首页动态规划
【DP】花瓶插花求美学最大值

【DP】花瓶插花求美学最大值

作者: 牛奶芝麻 | 来源:发表于2019-05-21 09:35 被阅读0次

问题描述:

现在有F束不同品种的花束,同时有至少同样数量的花瓶被按顺序摆成一行,其位置固定于架子上,并从1至V按从左到右顺序编号,V是花瓶的数目(F≤V)。花束可以移动,并且每束花用1至F的整数唯一标识。标识花束的整数决定了花束在花瓶中排列的顺序,如果i<j,那么花束i必须放在花束j左边的花瓶中。每个花瓶只能放一束花。如果花瓶的数目大于花束的数目,则多余的花瓶空置。

每一个花瓶都具有各自的特点。因此,当各个花瓶中放入不同的花束时,会产生不同的美学效果,并以一美学值(一个整数)来表示,空置花瓶的美学值为零。为取得最佳美学效果,必须在保持花束顺序的前提下,使花束的摆放取得最大的美学值。请求出具有最大美学值的一种摆放方式。

如图所示,有3束花(F)和5个花瓶(V),每束花插在不同位置的花瓶中有不同的美学价值。将花azaleas插在花瓶2中,花begonias插在花瓶4中,花carnations插在花瓶5中,即可得到最大美学值23+10+20=53。

Input
第一行两个正整数: F,V,F 表示花的数量,V 表示花瓶的数量。
接下来是 F 行 V 列的矩阵 A,Aij 是整数,表示 i 束花插在 j 花瓶中的美学价值。

1 <= F <= 100 
F <= V <= 100 
-50 <= Aij <= 50
Output
最大美学价值,如上例中的53。

解题思路:

北大OJ的1157题目;1999年的IOI题目。可以使用动态规划(DP)求解。

现约定:in[i][j] 表示第 i 朵花放在第 j 个瓶子里产生的美学值,dp[i][j] 表示前 i 朵花放入前 j 个瓶子中产生的最大美学值。

对于当前第 i 朵花,以及第 j 个瓶子,我们有两种选择:

  • 将第 i 朵花放入第 j 个瓶子。那么此时的美学值为:
    dp[i-1][j-1] + in[i][j]
  • 不将第 i 朵花放入第 j 个瓶子,而继续向后查询。那么此时的美学值为:
    dp[i][j-1]

做哪种选择,取决于哪个动作带来的美学值更高,也就是说:
dp[i][j] = max { dp[i-1][j-1] + in[i][j], dp[i][j-1] }

注意:

  • 初始化时只需要初始化第一行:
    dp[1][1] = in[1][1], dp[1][j] = max { dp[1][j-1], in[1][j] }
  • 计算第 2~F 行时,只需要计算下三角形区域(因为根据 dp[i][j] 的定义,j >= i)

C++实现:

#include<iostream>
using namespace std;

const int maxn = 101;
int in[maxn][maxn];
int dp[maxn][maxn];

int main() {
    int F, V;
    cin >> F >> V;
    for (int i = 1; i <= F; i++) {  // 输入美学值,可能为负
        for (int j = 1; j <= V; j++) {
            cin >> in[i][j];
        }
    }
    // 第1行初始化
    dp[1][1] = in[1][1];
    for (int i = 2; i <= V; i++) {
        dp[1][i] = max(dp[1][i-1], in[1][i]);
    }
    // dp求解第2~F行,上三角区域不用考虑,因为无意义
    for (int i = 2; i <= F; i++) {
        for (int j = i; j <= V; j++) {
            dp[i][j] = max(dp[i-1][j-1] + in[i][j], dp[i][j-1]); // 关键转移条件
        }
    }
    cout << dp[F][V];
    return 0;
}

相关文章

  • 【DP】花瓶插花求美学最大值

    问题描述: 现在有F束不同品种的花束,同时有至少同样数量的花瓶被按顺序摆成一行,其位置固定于架子上,并从1至V按从...

  • 鲜花插花技巧基础培训知识

    学习鲜花插花,要了解插花的基础知识。好比如大号花瓶、中号花瓶、小号花瓶这三种的插花艺术的鲜花的放置方法和插花技巧。...

  • 2019-05-14

    日志文本筛选-sort awk 求最大值: 求最小值: 求和: 求平均值: 求最大值 求最大值 求最小值 中位数

  • 线性表最值问题

    找最小值 找最大值 顺序表求最大值 顺序表求最小值 带头结点单链表求最大值 带头结点单链表求最小值 q是 最大值/...

  • Largest Divisible Subset

    题目来源求最大的可整除子集,就是子集中任意一对元素都是倍数关系。我主要利用dp来记录最大值,然后利用pre来记录对...

  • 学习插花大全基础插花入门要知道的知识点

    学习插花艺术入门 第一章 插花及其历史插花艺术基础知识 一、什么是插花插花就是把花插在花瓶、花盘、花盆等容器里,而...

  • 2018-03-24

    求最大值 假设表名为user,字段为pv,最大值为pv_max,求最大值db.user.aggregate([{"...

  • python:numpy数组常用的统计函数

    数据准备: 求和 求均值 求中值 求最大值和最小值 求极值(最大值和最小值之差)、 6、标准差

  • 意境

    室内松竹青又青,相对远山满翠屏。 雅居凭添幽静意,花瓶插花艺趣浓。 张小吹雅和 花瓶插花艺趣浓,松谷藏松景幽葱。 ...

  • 花瓶插花小技能

    选花瓶 ①花瓶高度一般为花材高度2/3 ②大花头选择胖瓶,小花头选苗条的瘦瓶 ③单一花材选择窄口花瓶,多花材搭配选...

网友评论

    本文标题:【DP】花瓶插花求美学最大值

    本文链接:https://www.haomeiwen.com/subject/nyzrzqtx.html