zoukankan      html  css  js  c++  java
  • 洛谷 SP740 TRT

    SP740 TRT - Treats for the Cows

    题目描述

    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.

    输入格式

    Line 1: A single integer, N

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

    输出格式

    The maximum revenue FJ can achieve by selling the treats

    题意翻译

    题目描述

    FJ经常给产奶量高的奶牛发特殊津贴,于是很快奶牛们拥有了大笔不知该怎么花的钱.为此,约翰购置了N(1≤N≤2000)份美味的零食来卖给奶牛们.每天FJ售出一份零食.当然FJ希望这些零食全部售出后能得到最大的收益.这些零食有以下这些有趣的特性:

    •零食按照1..N编号,它们被排成一列放在一个很长的盒子里.盒子的两端都有开口,FJ每天可以从盒子的任一端取出最外面的一个.

    •与美酒与好吃的奶酪相似,这些零食储存得越久就越好吃.当然,这样FJ就可以把它们卖出更高的价钱.

    •每份零食的初始价值不一定相同.FJ进货时,第i份零食的初始价值为Vi(1≤Vi≤1000)(Vi指的是从盒子顶端往下的第i份零食的初始价值).

    •第i份零食如果在被买进后的第a天出售,则它的售价是vi×a.

    FJ告诉了你所有零食的初始价值,并希望你能帮他计算一下,在这些零食全被卖出后,他最多能得到多少钱.

    输入输出格式

    输入格式

    第一行:一个整数n。 接下来的n行:每行一个整数Vi。

    输出格式

    FJ通过出售零食最多能得到的钱数。

    输入输出样例

    输入 #1

    5
    1
    3
    1
    5
    2

    输出 #1

    43

    【思路】

    区间DP

    【题目大意】

    每次都从左端点或者右端点选择一个零食
    获得的价值是这个零食的价值乘以是第几个选择的

    【核心思路】

    可以设置一个状态f(i,j)
    表示选取了i个零食,在左边选取了j个
    这个状态可以由前面选取了i - 1个零食
    在左边选取j个零食或者在左边选取了j-1个零食
    意思就是:
    之前选取了i-1个零食
    现在选取的第i个零食
    分别在左边选的还是在右边选的情况转移过来

    【DP方程式】

    [f[i][j] = max(f[i - 1][j] + a[n - i + 1 + j] * i,f[i - 1][j - 1] + a[j] * i) ]

    【完整代码】

    #include<iostream>
    #include<cstdio>
    
    using namespace std;
    const int Max = 2005;
    int a[Max];
    int f[Max][Max];
    
    int main()
    {
    	int n;
    	cin >> n;
    	for(register int i = 1;i <= n;++ i)
    		cin >> a[i];
    	for(register int i = 1;i <= n;++ i)
    		for(register int j = 0;j <= i;++ j)
    			f[i][j] = max(f[i - 1][j] + a[n - i + 1 + j] * i,f[i - 1][j - 1] + a[j] * i);
    	int M = 0;
    	for(register int i = 0;i <= n;++ i)
    		M = max(M,f[n][i]);
    	cout << M << endl;
    	return 0; 
    }
    
  • 相关阅读:
    SpringCloud Config 配置中心
    MySQL 8.0版本安装后,安装目录下找不到my.ini文件
    MySQL 跨库JOIN
    SpringCloud Ribbon 自定义负载均衡算法
    idea部署tomcat,日志打印显示乱码问题解决
    centos7配置回环网卡地址
    INV*物料接收子库存更新
    AP*供应商更新
    AR*Hz_Parties 客户表更新
    MyBatis-Plus自动生成代码
  • 原文地址:https://www.cnblogs.com/acioi/p/11704525.html
Copyright © 2011-2022 走看看