问题描述

Description

FJ has purchased N (1 <= N <= 2000) yummy treats for the cows who get money for giving vast amounts of milk. FJ sells one treat per day and wants to maximize the money he receives over a given period time.

The treats are interesting for many reasons:

  • The treats are numbered 1..N and stored sequentially in single file in a long box that is open at both ends. On any day, FJ can retrieve one treat from either end of his stash of treats.
  • Like fine wines and delicious cheeses, the treats improve with age and command greater prices.
  • The treats are not uniform: some are better and have higher intrinsic value. Treat i has value v(i) (1 <= v(i) <= 1000).
  • Cows pay more for treats that have aged longer: a cow will pay v(i)*a for a treat of age a.

Given the values v(i) of each of the treats lined up in order of the index i in their box, what is the greatest value FJ can receive for them if he orders their sale optimally?

The first treat is sold on day 1 and has age a=1. Each subsequent day increases the age by 1.

Input

Line 1: A single integer, N

Lines 2..N+1: Line i+1 contains the value of treat v(i)

Output

Line 1: The maximum revenue FJ can achieve by selling the treats

Sample Input

5 1 3 1 5 2 

Sample Output

43 

Hint

Explanation of the sample:

Five treats. On the first day FJ can sell either treat #1 (value 1) or treat #5 (value 2).

FJ sells the treats (values 1, 3, 1, 5, 2) in the following order of indices: 1, 5, 2, 3, 4, making 1x1 + 2x2 + 3x3 + 4x1 + 5x5 = 43.

Source

测试输入 期待的输出 时间限制 内存限制 额外进程
测试用例 1 以文本方式显示

  1. 5↵
  2. 1↵
  3. 3↵
  4. 1↵
  5. 5↵
  6. 2↵
以文本方式显示

  1. 43↵
1秒 64M 0

题解思路

题目等效含义:

给出一个数字序列,然后每次只可以从队首或是队尾取相应的数字并乘上次数,第几个取出,取出的元素就乘以几,然后将所有的乘完之后的元素加起来,求最大的和。

大致思路:

一开始的时候以为这道题就是一道贪心题目,因为对于样例贪心算法完全符合。但是交了之后才发现不对,例如这样一个用例8 1 9 7,如果按照贪心的思路是7*1+8*2+1*3+9*4=62,但是如果这样去9*4+7*3+1*2+8*1=67,显然贪心得到的结果是不对,所以就要利用动态规划的方法进行计算。我们可以利用由内到外的思路进行计算,在开始的时候假设每一个数字都可以是最后被取出的,然后依次向前利用动态规划进行计算,每一次比较前后乘以相应次数的结果的最大值,将其赋给当状态。最后输出dp[1][n]即可。

具体实现:

先将给出的数字存入一个数组里面,然后再定义一个二维数组表示相应的状态,用以记录取相应次数的时候得到的最大值。开始的时候假设每一个数字都可以是最后被取出的,然后利用一个两重循环,依此由内向外推即可。

注意事项:

(1)因为数字序列的长度比较大,所以定义的数组要当做全局变量,不然的话会re。

(2)状态转移方程注意数组的下标,注意数组下标的变换。

(3)注意最后的输出,根据自己的状态数组输出相应的一个值。

实现代码

<span style="font-family:Microsoft YaHei;font-size:14px;">#include<stdio.h>
#include<string.h>
int dp[2005][2005];
//int max(int x,int y)
//{
//  if(x>y)
//  return x;
//  return y;
//}
int main()
{int n,i,p,j;int jiazhi[2005];int temp1,temp2; memset(dp,0,sizeof(dp));scanf("%d",&n);for(i=0;i<n;i++){scanf("%d",&jiazhi[i]);dp[i][i]=jiazhi[i]*n;}for(p=1;p<=n;p++){for(i=0;i<n-p;i++){j=i+p;temp1=dp[i+1][j]+jiazhi[i]*(n-j+i);temp2=dp[i][j-1]+jiazhi[j]*(n-j+i);// dp[i][j]=max(dp[i+1][j]+jiazhi[i]*(n-j+i),dp[i][j-1]+jiazhi[j]*(n-j+i));if(temp1>temp2){dp[i][j]=temp1;}else{dp[i][j]=temp2;}}}printf("%d\n",dp[0][n-1]);return 0;
}</span>

Treats for the Cows相关推荐

  1. 动态规划训练20 [Treats for the Cows POJ - 3186 ]

    Treats for the Cows POJ - 3186 简单的区间DP,就不解释了. #include<iostream> #include<cstdio> using ...

  2. P2858 [USACO06FEB]Treats for the Cows G/S 题解

    emmmmmm,第二篇文章,多多写文章,好好掌握知识! 前言 原本在educoder上刷题,刷到[粉刷匠]一题,使用区间DP来做的.自己之前曾经小部分刷过背包DP的题目,对于区间DP还是知之甚少.在稍 ...

  3. POJ - 3186 Treats for the Cows DP

    传送门 乍一看与cf的某道题很相似,做了半天的贪心,然后是个二维dp. 这道题难的点在于你无法从最先取的值推到最后取的值,只能从内往外推.如果能看出来这点,其实就不难,但是很难想. 一开始dp[i][ ...

  4. poj3186 Treats for the Cows(区间)

    题目链接:http://poj.org/problem?id=3186 题意:第一个数是N,接下来N个数,每次只能从队列的首或者尾取出元素. ans=每次取出的值*出列的序号.求ans的最大值. 样例 ...

  5. BZOJ1652 [Usaco2006 Feb]Treats for the Cows

    蒟蒻许久没做题了,然后连动规方程都写不出了. 参照iwtwiioi大神,这样表示区间貌似更方便. 令f[i, j]表示i到j还没卖出去,则 f[i, j] = max(f[i + 1, j] + v[ ...

  6. POJ 3186 Treats for the Cows dp

    给你n个数   每一次只取一个数   只能前后两个方向取   第i次取出数的价值为自身价值*i   问最大价值为多少 #include<cstdio> #include<cstrin ...

  7. poj 3186 Treats for the Cows (区间dp)

    题意:给你一个序列,每次只能从头或为取数,然后乘以这是第几个数,最后加和,是加和最大 思路:假设长度最开始是1,然后依次枚举长度,以及起点,dp[i][j]是又里面的两端点扩出来的(ps:代码不是这么 ...

  8. [USACO06FEB]Treats for the Cows G/S奶牛零食(区间dp)

    洛谷 acwing #include <bits/stdc++.h> #include <iostream> #include <cstring> #include ...

  9. kuangbin带你飞专题合集

    题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...

最新文章

  1. socket.io的基本使用
  2. linux正则表达式awk讲解
  3. spring-注入对象list
  4. GDB调试基础操作详解【GDB调试】
  5. IDEA中进行SpringBoot开发时提示:Error resolving template xxx, template might not exist or might not be acce
  6. 人生第一个过 5K Star 的 项目 x-spreadsheet 感谢各位大佬的支持
  7. Charles调试Https Android
  8. python import
  9. opencv_python关于Qt的错误
  10. [css] 移动端的布局用过媒体查询吗?写出例子看看
  11. java volatile实例_Java的Volatile实例用法及讲解
  12. 【java】窗口控件及字符串和异常的综合应用
  13. php入门第二篇---变量
  14. 计算机专业学生专利,2019.6 电子与计算机工程学院学生喜获三项国家专利
  15. 小甲鱼python课后习题及答案
  16. 陕西2020行政区划调整_陕西行政区划调整畅想:西安咸阳合并可行,但成立直辖市不太现实...
  17. mp3lame linux 编译,linux下lame编程:wav转MP3示例代码
  18. LD文本相似度算法的在实际业务中的使用
  19. Sicily 1136 山海经 (SOJ 1136) 【Segment Tree 线段树】
  20. 职业书掉落及人物对照

热门文章

  1. 小说爬虫之幻月书院requests和re库
  2. 死亡结束生命,却不会结束一段关系
  3. 智慧物流园区供应链系统解决方案:赋能物流运输行业供应链新模式
  4. 在Excel中快速输入时间精确到秒
  5. 走进元宇宙:是什么、有什么、为什么?
  6. 爱思服务器显示磁盘空间不足,苹果磁盘空间不足怎么处理?
  7. boostrap老黄历代码的实现
  8. 固定电话呼叫转移设置方法
  9. 蚂蚁金服零号云客服遇到爬坑
  10. java实现word文件和xml文件互转