首页 > 其他分享 >花店橱窗布置(dp)

花店橱窗布置(dp)

时间:2023-05-29 21:46:11浏览次数:48  
标签:花店 橱窗 花瓶 int ll 放入 id dp

题目大意:

n束花和m个花瓶(m>=n),一个花瓶最多放入一束花,每束花放入各个花瓶会产生对应的观赏值,要求n束花都必须按给出的顺序从左到右放入花瓶中,求能产生的最大观赏值和相应方案

思路过程:

1.先考虑求最大观赏值,用dp[i][j]来表示到第i个花瓶时放入第j束花能产生的最大观赏值,转移方程式为:

dp[i][j] = max(dp[i][j], dp[k][j-1] + a[j][i]);

2.然后是求对应方案,这里可以由后往前推,由最后一束花放入的位置推出最后第二束花放入的位置,再重复往前推算

易错点:

1.dp数组的初始化应全为最小负数
2.边界dp[1][1]的赋值容易遗漏

代码如下:

#include<bits/stdc++.h>
#include<algorithm>
typedef long long ll;
using namespace std;
#define N 105
#define M -0x3fffffff
ll a[N][N],q[N],id;
ll dp[N][N];
int main(void)
{
	int n, m; cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cin >> a[i][j];
			dp[i][j] = M;
		}
	}
	dp[1][1]=a[1][1];
	for (int i = 1; i <= m; i++) {
		for (int j = 1; j <= n; j++) {
			//找前方最优的媒介点
			for(int k=1;k<i;k++)
				dp[i][j] = max(dp[i][j], dp[k][j-1] + a[j][i]);
		}
	}
	int x=m;
	for (int i = 1; i <= m; i++)
		if (dp[i][n] > dp[x][n])
			x = i;
	cout << dp[x][n] << endl;
	q[id++]=x;
	for (int i=x,j=n,k = x-1; k&&j>1; k--)
		if (dp[i][j] - a[j][i] == dp[k][j - 1]) {
			q[id++]=k;
			//向前推进
			i = k; j--; 
		}
	//翻转
    reverse(q, q + id);
	for (int i = 0; i < id; i++)
		cout << q[i] << "\n";
	return 0;
}

标签:花店,橱窗,花瓶,int,ll,放入,id,dp
From: https://www.cnblogs.com/markun0/p/17441738.html

相关文章

  • 【Socket】基于UDP的发送端和接收端
    UDP和TCP的差异UDP相比TCP,无需在连接状态下交换数据,因此UDP的server端和client端无需经过连接过程,即不必调用listen()和accept()函数。UDP中只有创建套接字和数据交换的过程。基于UDP的接收和发送函数当创建好TCP套接字后,传输数据时无需再添加地址信息,因此TCP套接字会保持与对......
  • 渗透---WordPress网站
    WordPress简介WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可以把WordPress当作一个内容管理系统(CMS)来使用。WordPress是一款个人博客系统,并逐步演化成一款内容管理系统软件,它是使用PHP语言和MySQL数据库开发的,用......
  • 渗透--WordPress网站
    WordPress简介WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可以把WordPress当作一个内容管理系统(CMS)来使用。WordPress是一款个人博客系统,并逐步演化成一款内容管理系统软件,它是使用PHP语言和MySQL数据库开发的,用......
  • nyoj 304(区间dp)
    解题思路:这道题很明显是用区间dp,可是与以往的区间dp不同,因为对于区间[i,j],机器人所处的位置要么在i,要么在j(因为机器人要移动到某一点才能关闭灯泡,所以对于某一段区间来说,机器人最后肯定在两个端点上,否则将不能成立),那么既然要表示在左端点还是右端点,所以我们再开三维数组dp[i][j][0]......
  • poj 2346(DP)
    题意:n位数,满足前n/2个数字之和同后n/2个数字之和相同的数一共有多少个?解题思路:dp[i][j]表示前i个数的和为j时,有多少个;递推关系:dp[i][j]+=dp[i-1][k],k表示前i-1个数的和,由于每一位只能是0-9,所以有限制条件:9>=j - k>=0由于对称性,只需要枚举到n/2即可,剩下的就是简单的乘法......
  • hdu 1511(dp)
    解题思路:两次dp确实很巧妙,我只想到了一次dp算出最后那个数最小,其实题目要求还要保证第一个数尽可能大,一开始也没有注意到。。AC:#include<stdio.h>#include<string.h>#include<algorithm>#include<iostream>#include<math.h>#include<stdlib.h>#include<time.h>usingnamesp......
  • hdu 5086(dp)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5086题目大意:给出长度为n的数组,然后要求累计里面的每个子串的和。解题思路:这道题直接枚举肯定不行,所以要找递推关系。假设:{1,2,3,4}为某一个序列,假设我们已经找到了{1,2,3},接下来把{4}加入进去;由于{1,2,3}已经有{1},{2},{3},{1,......
  • 【Oracle impdp/expdp】Big lesson from failure with impdp/expdp in 12c
     最近忙于做数据库12c-19c迁移,基于公司的情况,选用了最拿手的expdp/impdporacle自带的王者级别工具进行迁移。按照常规思路,一顿操作猛如虎,expdp直接选用full=y将数据全库导出,然后在19c中导入,无论是12c中的导出还是19c中的导入数据,没有任何的错误,然而在无意间,反过来去检查下两......
  • upc 6888: 守卫(区间dp O(n^2) )
    6888:守卫时间限制:1Sec  内存限制:512MB提交:102  解决:33[提交][状态][讨论版][命题人:admin]题目描述九条可怜是一个热爱运动的女孩子。这一天她去爬山,她的父亲为了她的安全,雇了一些保镖,让他们固定地呆在在山的某些位置,来实时监视九条可怜,从而保护她。具体来......
  • upc 6597: Don't Be a Subsequence (字符串的最短不匹配子序列 dp)
    6597:Don'tBeaSubsequence时间限制:1Sec  内存限制:128MB提交:237  解决:45[提交][状态][讨论版][命题人:admin] 题目描述AsubsequenceofastringSisastringthatcanbeobtainedbydeletingzeroormorecharactersfromSwithoutchangingtheor......