zoukankan      html  css  js  c++  java
  • 花店

    Description

    假设你想以最美观的方式布置花店的橱窗。现在你有F束不同品种的花束,同时你也有至少同样数量的花瓶被按顺序摆成一行。这些花瓶的位置固定于架子上,并从1至V顺序编号,V是花瓶的数目,从左至右排列,则最左边的是花瓶1,最右边的是花瓶V。花束可以移动,并且每束花用1至F间的整数唯一标识。标识花束的整数决定了花束在花瓶中的顺序,如果I<J,则令花束I必须放在花束J左边的花瓶中。你必须在保持花束顺序的前提下,使花束的摆放取得最大的美学值。

    Analysis

    对于花瓶i,花束j而言有两种情况。

    1. 放,则dp[i][j]=dp[i-1][j-1]+s[i][j]
    2. 不放,则dp[i][j]=dp[i-1][j]

    动规可行性判断:

    • 最优子结构:之前的花摆放美学值最大才能使之后的状态最优
    • 无后效性:做出选择后并不会妨碍之后花束的放置。
    dp[i][j]=max(dp[i-1][j-1]+s[i][j],dp[i-1][j])
    

    Code

    #include <bits/stdc++.h>
    
    int n,m,beauty[101][101],dp[101][101];
    
    int main()
    {
    	freopen("test.in","r",stdin);
    	freopen("test.out","w",stdout);
    	std::cin>>n>>m;
    	for(int i=1;i<=n;i++)
    	for(int j=1;j<=m;j++)
    		std::cin>>beauty[j][i];
    	for(int i=0;i<=m;i++)
    	for(int j=1;j<=n;j++)
    		dp[i][j]=-10000;
    	for(int i=1;i<=m;i++)
    	for(int j=1;j<=n;j++)
    		dp[i][j]=std::max(dp[i-1][j],dp[i-1][j-1]+beauty[i][j]);
    	std::cout<<dp[m][n]<<std::endl;
    	return 0;
    }
    
  • 相关阅读:
    project euler 开坑
    hdu 5382 GCD?LCM!
    Leetcode 557. 反转字符串中的单词 III
    Leetcode 344. 反转字符串
    Leetcode 345. 反转字符串中的元音字母
    008.C++类改写模板类
    007.C++构造函数
    006.C++头文件
    02.树的序列化与反序列化(C++)
    Leetcode 94. 二叉树的中序遍历
  • 原文地址:https://www.cnblogs.com/qswx/p/9492435.html
Copyright © 2011-2022 走看看