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 问题: 你想要将你的 ...
随机推荐
- D3.js 入门教程
最近需要用到d3, 记录下d3的教程 网上搜了几个关于d3的教程 D3.js 入门教程 http://wiki.jikexueyuan.com/project/d3wiki/author.h ...
- 微服务架构之spring boot admin
Spring boot admin是可视化的监控组件,依赖spring boot actuator收集各个服务的运行信息,通过spring boot actuator可以非常方便的查看每个微服务的He ...
- Http请求超时的一种处理方法
URLConnection类常见的超时处理就是调用其setConnectTimeout和setReadTimeout方法: setConnectTimeout:设置连接主机超时(单位:毫秒) setR ...
- Python FFT (Fast Fourier Transform)
np.fft.fft import matplotlib.pyplot as plt import plotly.plotly as py import numpy as np # Learn abo ...
- Redirect local emails to a remote email account
My previous post is a guide for setting up exim4, an SMTP mail server, to use Gmail as a smarthost. ...
- [转] Linux 3.10 ARM Device Tree 的初始化
[转] Linux 3.10 ARM Device Tree 的初始化 本文代码均来自标准 linux kernel 3.10,可以到这里下载 https://www.kernel.org/ ...
- HttpStatus
/* * Copyright 2002-2017 the original author or authors. * * Licensed under the Apache License, Vers ...
- xshell5 可用注册码
101210-450789-147200(可以激活Xshell5,而且可以升级) 亲测可用 只能用于xshell5
- mac 下常用快捷键
1.快速搜索某个类 双击thift 2.切换不同的类: ctrl+方向键 3.alt+command+B 进入到具体的子类 但是 ctrl+方向键一直切的是电脑上 桌面的切换.打开 系统偏好设置-快捷 ...
- Python中的基础数据类型
Python中基础数据类型 1.数字 整型a=12或者a=int(2),本质上各种数据类型都可看成是类,声明一个变量时候则是在实例化一个类. 整型具备的功能: class int(object): & ...