tyvj1124花店橱窗——有限制的DP

题目:http://www.joyoi.cn/problem/tyvj-1124

此题首先注意一束花能往哪些花瓶中放置:原本应放在本位置,但因为有多余花瓶,故可以有些变动,范围在i~i+v-f间;

假设选择此花瓶,则对其上一束花的摆放位置有要求:放在此花瓶之前;故再用k循环一遍;

输出路径在上一步中记录,只需以角标记录此花这种摆放方式对应的上一束花的摆放位置,递归输出即可。

代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
int f,v,w[105][105],path[105][105],dp[105][105],ans,p;
void print(int i,int j)
{
	if(!i)return;
	print(i-1,path[i][j]);
	printf("%d ",j);
}
int main()
{
	scanf("%d%d",&f,&v);
	for(int i=1;i<=f;i++)
		for(int j=1;j<=v;j++)
			scanf("%d",&w[i][j]);
	for(int i=1;i<=f;i++)
	{
		int up=i+v-f;
		for(int j=i;j<=up;j++)
		{
			dp[i][j]=dp[i-1][i-1]+w[i][j];//!
			path[i][j]=i-1;//!
			for(int k=i;k<j;k++)//不能k=i-1!
			{
				if(dp[i][j]<dp[i-1][k]+w[i][j])
				{
					dp[i][j]=dp[i-1][k]+w[i][j];
					path[i][j]=k;
				}
			}
		}
	}
	for(int i=f;i<=v;i++)
	{
		if(dp[f][i]>ans)
		{
			ans=dp[f][i];
//			p=path[f][i];
			p=i;
		}
	}
	printf("%d\n",ans);
	print(f,p);
	return 0;
}

  

原文地址:https://www.cnblogs.com/Zinn/p/8457552.html

时间: 2024-08-30 03:04:24

tyvj1124花店橱窗——有限制的DP的相关文章

TYVJ1124 花店橱窗

http://www.tyvj.cn/Problem_Show.aspx?id=1124 设状态dp[i][j] 为第i个花放入第j个瓶子里所能得到的最大价值  且  (i<=j<=i+m-n) dp[i][j] = max{dp[i-1][k]  |  i-1<=k<j}  + a[i][j] (a[i][j]为第i个花放入第j个瓶的价值) 每次转移的时候记录下路径,输出的时候dfs回去就ok了~ 1 #include <cstdio> 2 #include <

RQNOJ PID496/[IOI1999]花店橱窗布置

PID496 / [IOI1999]花店橱窗布置 ☆ 题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序 编号,V是花瓶的数目.花束可以移动,并且每束花用1到F的整数标识.如果I < J,则花束I必须放在花束J左边的花瓶中.例如,假设杜鹃花的标识数为1,秋海棠的标识数为2,康乃馨的标识数为3,所有花束在放入花瓶时必须保持其标识 数的顺序,即杜鹃花必须放在秋海棠左边的花瓶中,秋海棠必须放在康乃馨左边的花瓶中.如果

花店橱窗(flower)

花店橱窗(flower) 题目描述 某花店现有f束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V是花瓶的数目.花束可以移动,并且每束花用1:到f的整数标识.如果i 输入 第1行两个整数f和V,分别为花束数和花瓶数(1≤f≤100,f≤V≤I00).接下来是矩阵Aij,它有i行,每行j个整数,hij表示花束i摆放在花瓶j中的美学值. 输出 第1行是一个整数,为最大的美学值:接下来有f行,每行两个数,为那束花放入那个花瓶的编号

1028 花店橱窗布置

1028 花店橱窗布置 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整数)表示每束花放入每个花瓶所产生的美学效果.为了取得最佳的美学效果,必须使花的摆放取得最大的美学值. 输入描述 Input Description 第一行为两个整数F,V(F<=V<=100) 接下来F行每行V个整数,第i行第j个数表示第i束花放入第j个花瓶的美学值. 输

P1854 花店橱窗布置

P1854 花店橱窗布置 题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V是花瓶的数目.花束可以移动,并且每束花用1到F的整数标识.如果I < J,则花束I必须放在花束J左边的花瓶中.例如,假设杜鹃花的标识数为1,秋海棠的标识数为2,康乃馨的标识数为3,所有花束在放入花瓶时必须保持其标识数的顺序,即杜鹃花必须放在秋海棠左边的花瓶中,秋海棠必须放在康乃馨左边的花瓶中.如果花瓶的数目大于花束的数目,则多余

花店橱窗(线性dp)

设dp[i][j],表示插第i朵花插到第j个花瓶时,最大值多少 若不插在花瓶j中则,dp[i][j]=dp[i][j-1] 若插,则dp[i][j]=max{dp[i-1][j-1]+a[i][j]}; #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=110; int a[maxn][maxn]; int dp[maxn][maxn];

luogu1854 花店橱窗布置 简单dp+输出方案

题目链接:https://www.luogu.com.cn/problem/P1854 ioi1999的题,其实是个水题.dp[i][j]表示第i种花插入到第j个花瓶,能取得的最大总价值.dp[i][j]=max(dp[i][j],dp[i-1][k]+a[i][j]) 注意j和k的范围.因为花的位置严格递增,所以j>=i;i-1<=k<=j-1:还有要注意dp数组要初始化为负数,因为美学值可以为负数 代码如下: #include<bits/stdc++.h> using n

【Luogu】P1854花店橱窗布置(DP)

照例良心题目链接 此题使用f[i][j]表示前i束花放进前j个花瓶的时候的最大值.转移方程如下 f[i][j]=max(f[i][j-1],f[i-1][j-1]+que[i][j]) 其中que[i][j]表示第i束花放进第j个花瓶里的情况.有这个转移方程的原因是,每一束花在每一个花瓶里的情况只有两种:放进去了和没放进去.第一种f[i][j-1]就是没放进去,第二种 f[i-1][j-1]+que[i][j]就是放进去了的情况 特殊的,当i>=j时第一种情况不能成立 路径保存死活没想出来,最后

[luoguP1854] 花店橱窗布置(DP)

传送门 f[i][j] 表示前 i 盆花,放到前 j 个花盆中的最优解 pre[i][j] 记录前驱 代码 #include <cstdio> #include <cstring> #include <iostream> #define N 1001 #define max(x, y) ((x) > (y) ? (x) : (y)) int n, m, t; int a[N][N], f[N][N], pre[N][N], s[N]; inline int rea