POJ 1157 LITTLE SHOP OF FLOWERS (超级经典dp,两种解法)
Each vase has a distinct characteristic (just like flowers do). Hence, putting a bunch of flowers in a vase results in a certain aesthetic value, expressed by an integer. The aesthetic values are presented in a table as shown below. Leaving a vase empty has an aesthetic value of 0.
V A S E S |
||||||
1 |
2 |
3 |
4 |
5 |
||
Bunches |
1 (azaleas) |
7 | 23 | -5 | -24 | 16 |
2 (begonias) |
5 | 21 | -4 | 10 | 23 | |
3 (carnations) |
-21 |
5 | -4 | -20 | 20 |
According to the table, azaleas, for example, would look great in vase 2, but they would look awful in vase 4.
To achieve the most pleasant effect you have to maximize the sum of aesthetic values for the arrangement while keeping the required ordering of the flowers. If more than one arrangement has the maximal sum value, any one of them will be acceptable. You have to produce exactly one arrangement.
Input
- The first line contains two numbers: F, V.
- The following F lines: Each of these lines contains V integers, so that Aij is given as the jth number on the (i+1)st line of the input file.
- 1 <= F <= 100 where F is the number of the bunches of flowers. The bunches are numbered 1 through F.
- F <= V <= 100 where V is the number of vases.
- -50 <= Aij <= 50 where Aij is the aesthetic value obtained by putting the flower bunch i into the vase j.
Output
Sample Input
- 3 5
- 7 23 -5 -24 16
- 5 21 -4 10 23
- -21 5 -4 -20 20
Sample Output
- 53
- 题目意思:
- 每种花有一个编号,有几个花瓶,花瓶也是有编号的,每种花放在不同的花瓶的艺术价值不一样,
要你把这些花按某种策略放在这些花瓶里,得到艺术价值总值最大,
并且,编号小的花所在的花瓶的编号要比编号大的花所在花瓶的编号小。- 我的思想:
- n=花种类,m=花瓶种类
输入数据的范围告诉你:n<=m
保证了插花方案的多样性
a[i][j]:表示第i朵花放第j个花瓶的艺术值
所以我们想象一下
1.前i种花放入前j个花瓶
2.前i种花放入前j-1个花瓶(要求编号小的花所在的花瓶的编号要比编号大的花所在花瓶的编号小。)- 设dp[i][j]:表示前面i朵花放前面j个瓶子里面的艺术总值
1.对于前i种花放入前j个花瓶这种方案:就是前面的i-1种花放入前面j-1种花瓶里面,然后第i种花放入第j种花瓶里面
所以:dp[i][j]=dp[i-1][j-1]+a[i][j]- 2.前i中花放入前j-1个花瓶
所以:dp[i][j-1]- 取两种方案里面最大的那个
所以:
dp[i][j]=max(dp[i-1][j-1]+a[i][j],dp[i][j-1])- 注意初始化的时候
dp[i][i]=dp[i-1][i-1]+a[i][i]
对角线初始化
因为第i朵花不能插编号i前面的花瓶
所以应该这样初始化!!!- code:
- #include <iostream>
- #include <cstdio>
- #include<stdio.h>
- #include<algorithm>
- #include<cstring>
- #include<math.h>
- #include<memory>
- #include<queue>
- #include<vector>
- using namespace std;
- #define max_v 105
- #define INF 99999999
- int dp[max_v][max_v];//前面i朵花放前面j个瓶子里面的艺术总值
- int a[max_v][max_v];//第i朵花放第j个瓶子的艺术值
- int main()
- {
- int n,m;
- while(~scanf("%d %d",&n,&m))
- {
- for(int i=;i<=n;i++)
- {
- for(int j=;j<=m;j++)
- {
- scanf("%d",&a[i][j]);
- }
- dp[i][i]=dp[i-][i-]+a[i][i];
- }
- for(int i=;i<=n;i++)
- {
- for(int j=i+;j<=m;j++)
- {
- dp[i][j]=max(dp[i-][j-]+a[i][j],dp[i][j-]);
- }
- }
- printf("%d\n",dp[n][m]);
- }
- return ;
- }
思路二:
现在我们从另外一个角度思考
dp[i][j]:现在放第i种花到第j种瓶子里面得到的当前艺术总值
我们从第一种花开始放,那么我们需要的结果就是看把最后一朵花放入到哪个瓶子里面得到的艺术值中最大的哪个艺术值
dp[i][j]=max(dp[i-1][k])+a[i][j]
i-1<=k<j
所以说就是找一个最好的k,要使得当前的状态是最好的,那么我们就要找一个最好的上一个状态加上当前的值,那么这样当前的状态就是最好的
所以就是找一个合适的k
比如现在将第i种花插入到j种花瓶里面,在上一个状态中(插第i-1朵花)找一个合适的花瓶k使得上一个状态是最优的!
那就当前状态就是上面的最优状态加上当前i花插j瓶值的状态也是最优的
所以先开始初始化,我们知道每一种状态都是继承与上一种状态,插第一种花的时候,前面没有状态了,是继承不了的,算不出来,所以我们应该初始化给它赋值 dp[1][j]=a[1][j] j属于1到m
从第二种花开始算,在前面的状态中(插第一朵花)找个最优的加上i花插j瓶的值,那么当前状态就是最优的
注意数据范围:
算的时候i是2到n
j是i到m(要求编号小的花所在的花瓶的编号要比编号大的花所在花瓶的编号小)
k是i-1到j-1,不能取j,因为j是当前状态的值,你只能在前面找一个最好状态的k,不能找当前的嘛
注意理解状态转移方程:
dp[i][j]=max(dp[i-1][k])+a[i][j]
i-1<=k<j
code:
- #include <iostream>
- #include <cstdio>
- #include<stdio.h>
- #include<algorithm>
- #include<cstring>
- #include<math.h>
- #include<memory>
- #include<queue>
- #include<vector>
- using namespace std;
- #define max_v 105
- #define INF 99999999
- int dp[max_v][max_v];//现在放第i种花到第j种花瓶的艺术值
- int a[max_v][max_v];//第i朵花放第j个瓶子的艺术值
- int main()
- {
- int n,m;
- while(~scanf("%d %d",&n,&m))
- {
- for(int i=;i<=n;i++)
- {
- for(int j=;j<=m;j++)
- {
- scanf("%d",&a[i][j]);
- }
- }
- memset(dp,,sizeof(dp));
- for(int j=;j<=m;j++)//初始化
- dp[][j]=a[][j];//第1种花放第j种花瓶中的艺术值
- for(int i=;i<=n;i++)//从第二种花开始放
- {
- for(int j=i;j<=m;j++)//第i种花放的花瓶编号不能小于i,所以j属于i到m
- {
- int x=-INF;
- for(int k=i-;k<j;k++)//找k
- {
- x=max(x,dp[i-][k]);
- }
- dp[i][j]=x+a[i][j];
- }
- }
- int ans=-INF;
- for(int j=n;j<=m;j++)//找max
- {
- ans=max(ans,dp[n][j]);
- }
- printf("%d\n",ans);
- }
- return ;
- }
POJ 1157 LITTLE SHOP OF FLOWERS (超级经典dp,两种解法)的更多相关文章
- Little shop of flowers - SGU 104 (DP)
题目大意:把 M 朵花插入 N 个花瓶中,每个花插入不同的花瓶都有一个价值A[Mi][Nj],要使所有的花都插入花瓶,求出来最大的总价值(花瓶为空时价值是0). 分析:dp[i][j]表示前i朵花插入 ...
- POJ 1080:Human Gene Functions LCS经典DP
Human Gene Functions Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18007 Accepted: ...
- POJ 1182食物链(分集合以及加权两种解法) 种类并查集的经典
题目链接:http://icpc.njust.edu.cn/Problem/Pku/1182/ 题意:给出动物之间的关系,有几种询问方式,问是真话还是假话. 定义三种偏移关系: x->y 偏移量 ...
- POJ 1979 dfs和bfs两种解法
fengyun@fengyun-server:~/learn/acm/poj$ cat 1979.cpp #include<cstdio> #include<iostream&g ...
- 【LA3487】最小割-经典模型 两种方法
题目链接 题意:A.B两个公司要买一些资源(他们自己买的资源不会重复),一个资源只能卖给一个公司.问最大收益. simple input 部分: 54 1 //买到1就给54元 15 2 33 3 2 ...
- poj 3311 floyd+dfs或状态压缩dp 两种方法
Hie with the Pie Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6436 Accepted: 3470 ...
- POJ 1515 Street Directions --一道连通题的双连通和强连通两种解法
题意:将一个无向图中的双向边改成单向边使图强连通,问最多能改多少条边,输出改造后的图. 分析: 1.双连通做法: 双连通图转强连通图的算法:对双连通图进行dfs,在搜索的过程中就能按照搜索的方向给所有 ...
- 一道JAVA经典面试题目的两种解法
题目要求:String s="-1 2 5 78 129 -65 -23";将字符串进行升序排序后输出. 方法一:使用数组进行排序 思路: 1.获取字符串中的数值: 2.将数组 ...
- sgu 104 Little shop of flowers 解题报告及测试数据
104. Little shop of flowers time limit per test: 0.25 sec. memory limit per test: 4096 KB 问题: 你想要将你的 ...
随机推荐
- Ubuntu重启网卡的三种方法
一.network利用root帐户# service network restart 或者/etc/init.d/networking restart 二.ifdown/ifup# ifdown et ...
- Oracle数据库基本操作 (五) —— 使用java调用存储过程
一.环境准备 登录Oracle数据库scott账号,利用emp进行操作. 1.创建 proc_getyearsal 存储过程 -- 获取指定员工年薪 create or replace procedu ...
- stm32f10x单片机进阶--spi使用
使用SPI与外部flash(MX25L6406EM21)IC通信 连接方式 如上图所示,MCU通过SPI2与外部flash芯片进行相连接. MCU spi2初 ...
- csharp: 图片字符间距
引用WINDOWS API: [DllImport("gdi32.dll", CharSet = CharSet.Auto)] public static extern int S ...
- System Monitor ArcGIS系统监控利器
System Monitor是Esri推出的GIS系统监控工具,对于GIS数据中心的运维人员是难得的利器.早期版本是开源免费的解决方案,在今年的Esri 全球用户大会上,Esri宣布将发行商业版的Sy ...
- 自定义BaseActivity
思路很简单:将软件里用到的大量重复的页面布局抽象出来,编写成一个抽象的Activity类,然后在实现具体页面时继承它,并且在主内容空白区填入需要的内容. 例如在最近开发的一款资讯类应用中,每张页面上面 ...
- Android Weekly Notes Issue #247
Android Weekly Issue #247 March 5th, 2017 Android Weekly Issue #247. 本期内容包括: 离线模式的实现; RxJava2的测试支持; ...
- Spring Cloud中,Eureka常见问题总结
Spring Cloud中,Eureka常见问题总结. 1 eureka.environment: 指定环境 参考文档: 1 eureka.datacenter: 指定数据中心 参考文档: 使用配置项 ...
- Python套接字
1.客户端/服务器架构 什么是客户端/服务器架构?对于不同的人来说,它意味着不同的东西,这取决于你问谁以及描述的是软件还是硬件系统.在这两种情况中的任何一种下,前提都很简单:服务器就是一系列硬件或软件 ...
- JS字面量创建方式的优缺点
http://www.cnblogs.com/wuyaxing/p/6416441.html