zoukankan      html  css  js  c++  java
  • 区间dp

    http://poj.org/problem?id=3186

    Treats for the Cows
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 9704   Accepted: 5021

    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.
    题意:给你n个数,每次从两端取,取完为止,取得每个数*取得顺序(1,2,... n),使该值最大为多少?
    思路:区间dp,dp[i][j]表示从i到j区间取值最大,可以由dp[i+1][j] 和 dp[i][j-1] 这两区间转移而来
    //#include <bits/stdc++.h>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <stdio.h>
    #include <queue>
    #include <stack>
    #include <map>
    #include <set>
    #include <string.h>
    #include <vector>
    #define ME(x , y) memset(x , y , sizeof(x))
    #define SF(n) scanf("%d" , &n)
    #define rep(i , n) for(int i = 0 ; i < n ; i ++)
    #define INF  0x3f3f3f3f
    #define mod 998244353
    #define PI acos(-1)
    using namespace std;
    typedef long long ll ;
    int a[2009] , dp[2009][2009];
    
    int main()
    {
        int n ;
        scanf("%d" , &n);
        for(int i = 1 ; i <= n ; i++)
        {
            scanf("%d" , &a[i]);
        }
        memset(dp , 0 , sizeof(dp));
        for(int i = n ; i >= 1 ; i--)
        {
            for(int j = i ; j <= n ; j++)
            {
                dp[i][j] = max(dp[i+1][j] + a[i]*(n+i-j) , dp[i][j-1] + a[j]*(n+i-j));
            }
        }
        cout << dp[1][n] << endl ;
        return 0 ;
    }
  • 相关阅读:
    Laravel 初始化
    ant design pro 左上角 logo 修改
    请求到服务端后是怎么处理的
    Websocket 知识点
    王道数据结构 (7) KMP 算法
    王道数据结构 (6) 简单的模式匹配算法
    王道数据结构 (4) 单链表 删除节点
    王道数据结构 (3) 单链表 插入节点
    王道数据结构 (2) 单链表 尾插法
    王道数据结构 (1) 单链表 头插法
  • 原文地址:https://www.cnblogs.com/nonames/p/11779480.html
Copyright © 2011-2022 走看看