Treats for the Cows 区间DP POJ 3186
题目来源:http://poj.org/problem?id=3186
(http://www.fjutacm.com/Problem.jsp?pid=1389)
/**
题目意思:
约翰经常给产奶量高的奶牛发特殊津贴,于是很快奶牛们拥有了大笔不知该怎么花的钱.
为此,约翰购置了N(1≤N≤2000)份美味的零食来卖给奶牛们.每天约翰售出一份零食.
当然约翰希望这些零食全部售出后能得到最大的收益.这些零食有以下这些有趣的特性:
零食按照1..N编号,它们被排成一列放在一个很长的盒子里.盒子的两端都有开口,约翰每
天可以从盒子的任一端取出最外面的一个.
与美酒与好吃的奶酪相似,这些零食储存得越久就越好吃.当然,这样约翰就可以把它们卖出更高的价钱.
每份零食的初始价值不一定相同.约翰进货时,第i份零食的初始价值为Vi(1≤Vi≤1000).
第i份零食如果在被买进后的第a天出售,则它的售价是vi×a.
Vi的是从盒子顶端往下的第i份零食的初始价值.约翰告诉了你所有零食的初始价值,
并希望你能帮他计算一下,在这些零食全被卖出后,他最多能得到多少钱.
**/
思路:这是一题区间动态规划,但是又不是那么复杂的区间动态规划;
这题要先找对状态,不然很难进行下去,也许别的小伙伴有别的状态,但是我找的状态是dp[i][j]表示i~j范围内取出倒数j-i+1个物品的最大值,比如dp[i][i]就是第取出倒数第一个为a[i]可以获得的值,dp[i-1][i]同理,表示倒数第一、二个为a[i-1],a[i]的最大值。
然后找对状态了要找转移方程:对于这题先要搞清楚我们是逆推,从区间小推向区间大,也就是用小的求大的,所以dp[i][j]是由比他小的部分加上一些东西组成的,此时我们可以发现,dp[i][j]这个区间我们只有两种取法(题目给的是一个双端队列一样的东西),也就是我们只能取a[j]或者a[i]这两个数,而且这两个数一定是在倒数j-i次取的,因为之前只有j-i- 1(可能是a[i]或a[j]) 个数,而且都是倒数着的,这样我们就可以发现,dp[i][j]=Max(dp[i+1][j]+a[i]*(n-(j-i)), dp[i][j-1]+a[j]*(n-(j-i)));看下面这个图你就能理解他是怎么步步紧逼的合并状态的:
斜着的颜色分层的部分就表示i、j距离不同时由某些状态过来的最大值,余下的看看代码吧!
#include<stdio.h>
#include<string.h>
const int N=;
int dp[N][N], a[N];
int Max(int a, int b){ return a>b?a:b; }
int main( ){
int n;
while(scanf("%d", &n)!=EOF){
memset(dp, , sizeof(dp));
for(register int i=; i<=n; ++i)
scanf("%d", a+i), dp[i][i]=a[i]*n;///设置为当第i个数为最后一个被取的数的情况;
for(register int l=; l<=n; ++l){///先跑i、j距离为1的区间,然后顺延下去才可以保证不会出错
for(register int i=; i+l<=n; ++i){
int j=i+l;
dp[i][j]=Max(dp[i+][j]+a[i]*(n-l), dp[i][j-]+a[j]*(n-l));
}
}
printf("%d\n", dp[][n]);
}
}
Treats for the Cows 区间DP POJ 3186的更多相关文章
- POJ3186:Treats for the Cows(区间DP)
Description FJ has purchased N (1 <= N <= 2000) yummy treats for the cows who get money for gi ...
- POJ3086 Treats for the Cows(区间DP)
题目链接 Treats for the Cows 直接区间DP就好了,用记忆化搜索是很方便的. #include <cstdio> #include <cstring> #i ...
- O - Treats for the Cows 区间DP
FJ has purchased N (1 <= N <= 2000) yummy treats for the cows who get money for giving vast am ...
- POJ 3186Treats for the Cows(区间DP)
题目链接:http://poj.org/problem?id=3186 题目大意:给出的一系列的数字,可以看成一个双向队列,每次只能从队首或者队尾出队,第n个出队就拿这个数乘以n,最后将和加起来,求最 ...
- poj3186 Treats for the Cows(区间)
题目链接:http://poj.org/problem?id=3186 题意:第一个数是N,接下来N个数,每次只能从队列的首或者尾取出元素. ans=每次取出的值*出列的序号.求ans的最大值. 样例 ...
- 区间DP POJ 1141 Brackets Sequence
Brackets Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 29520 Accepted: 840 ...
- 【BZOJ】1652: [Usaco2006 Feb]Treats for the Cows(dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1652 dp.. 我们按间隔的时间分状态k,分别为1-n天 那么每对间隔为k的i和j.而我们假设i或者 ...
- POJ 3186 Treats for the Cows ——(DP)
第一眼感觉是贪心,,果断WA.然后又设计了一个两个方向的dp方法,虽然觉得有点不对,但是过了样例,交了一发,还是WA,不知道为什么不对= =,感觉是dp的挺有道理的,,代码如下(WA的): #incl ...
- POJ 3186Treats for the Cows (区间DP)
详见代码 #include <stdio.h> #include <algorithm> #include <string.h> using namespace s ...
随机推荐
- toast components
toast components https://jossmac.github.io/react-toast-notifications/ https://docs.microsoft.com/en- ...
- Spring面试,IoC和AOP的理解, @Transactional原理及使用
spring 的优点?1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实 ...
- static变量 方法 类 和final
static变量:声明为static的变量实质上就是全局变量.当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量.静态变量与静态方法类似.所有此类实例共 ...
- Day22-Django之缓存
由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5 ...
- git 复位出现If no other git process is currently running, this probably means a git process crashed in this repo
复位到A节点的时候点了取消(终止),又去复位另外个节点,结果每次不管复位哪个都会报这个错误 fatal: Unable to create 'XXXXXXXXX' : File exists. If ...
- 【ZOJ3899】State Reversing 解题报告
[ZOJ3899]State Reversing Description 有\(N\)个不同的怪兽,编号从\(1\) 到\(N\).Yukari有\(M\)个相同的房间,编号为\(1\)到\(M\). ...
- 洛谷 P2022 有趣的数 解题报告
P2022 有趣的数 题目描述 让我们来考虑1到N的正整数集合.让我们把集合中的元素按照字典序排列,例如当N=11时,其顺序应该为:1,10,11,2,3,4,5,6,7,8,9. 定义K在N个数中的 ...
- 解题:CF949D Curfew
题面 整体的思路就是在均摊每个宿舍的人数,注意一个人可以跑好几次=.= 可以发现多的学生往中间跑一定能跑过宿管,所以只考虑学生们能不能及时跑到人不够的宿舍.对两边记录两个已经满足要求的宿舍,然后用前/ ...
- 简单版AC自动机
简单版\(AC\)自动机 学之前听别人说起一直以为很难,今天学了简单版的\(AC\)自动机,感觉海星,只要理解了\(KMP\)一切都好说. 前置知识:\(KMP\)(有链接) 前置知识:\(Trie\ ...
- 3:JavaBean,EJB,POJO
JavaBeanJavaBean是公共Java类,但是为了编辑工具识别,需要满足至少三个条件: 有一个public默认构造器(例如无参构造器,) 属性使用public 的get,set方法访问,也就是 ...