POJ 3186 Treats for the Cows
2015-10-29 00:30
344 查看
Treats for the Cows
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 4748 | Accepted: 2447 |
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.
题意是给定一串数字,每次只能从头或者尾输出,每次输出都有一个权值,且权值从1到N递增。问怎么取得到的最后的值最大。
首先要确定dp数组,我们可以设置dp[i][j]表示从i为第一个数字到j为最后一个数字的这一串数字对应的最大的值。
很容易就可以得出 dp[i][j] = max(dp[i + 1][j] + a[i] * (N - j + i), dp[i][j - 1] + a[j] * (N - j + i))
也就是比较下一次从两边取那个更大。
代码如下:
/************************************************************************* > File Name: Treats_for_the_Cows.cpp > Author: Zhanghaoran > Mail: chilumanxi@xiyoulinux.org > Created Time: Wed 28 Oct 2015 03:11:28 PM CST ************************************************************************/ #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <cstdlib> using namespace std; int N; int dp[2010][2010]; int a[2010]; int main(void){ scanf("%d", &N); for(int i = 1; i <= N; i ++){ scanf("%d", &a[i]); dp[i][i] = a[i]; } for(int i = N; i > 0; i --){ for(int j = i; j <= N; j ++){ dp[i][j] = max(dp[i + 1][j] + a[i] * (N - j + i), dp[i][j - 1] + a[j] * (N - j + i)); } } printf("%d\n", dp[1] ); return 0; }
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#获取关键字附近文字算法实例