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 问题: 你想要将你的 ...
随机推荐
- JAVA_吸血鬼数字 多种方法实现
package test4; import java.util.Arrays; /** * 从TIJ中第4章的练习10看到“吸血鬼数字”,以下几种方法实现以及执行时间对比 * 找出四位数的所有吸血鬼数 ...
- Ubuntu16.04下安装MATLAB 2016b!完美运行
目录 1.下载MATLAB 2016b 2.挂载iso 3.安装MATLAB 4.破解 5.快捷键与运行 1.下载MATLAB 2016b 下载matlab 2016b for linux(可以百度搜 ...
- C# 简单的loading提示控件
自己画一个转圈圈的控件 using System; using System.Collections.Generic; using System.ComponentModel; using Syste ...
- MongoDB 更改数据库位置
MongoDB在Windows中默认的数据库目录是 C:\data.如果在没有该目录的情况下,执行命令mongod,则会报如下错误: 如果我们不想把mongoDB的数据库放在C盘,可以使用如下两种方法 ...
- JS判断客户端是手机还是PC的2个代码
搬了下砖 function IsPC() { var userAgentInfo = navigator.userAgent; var Agents = ["Android", & ...
- 50+ Useful Docker Tools
As containers take root, dozens of tools have sprung up to support them. Check out your options for ...
- VC学习笔记---ATL MFC CLR三个库的区别
MFC.ATL和CLR是VC2005内置的三大库,涵盖了Windows的各种开发方法和开发应用.当然关于C++开发的库不止这三个,不过这三个是微软推荐. 从编程所处层次而言,WIN32为最底层,其次是 ...
- Java 快速入门-06-JDK 目录文件说明
Java 快速入门-06-JDK 目录文件说明 JDK:开发环境,搞技术的人或者应用服务器使用 JRE:运行环境,如浏览器插件或者Swing界面的客户端等最终用户需要使用 JDK自含一个JRE,并依赖 ...
- mac自动生成路径问题
使用myBatis的逆向工程,一直无法生成.最后找同事帮忙,最终发现是 :路径前面少加一个反斜杠... 也就是 mac的绝对路径 前面需要加上 反斜杠.
- forkjoin框架疑问记录
今天在看jdk1.7的forkjoin框架时候,里面有个例子如下: product类: public class Product { private String name; private doub ...