洛谷P3009 [USACO11JAN]利润Profits 题解

 https://www.luogu.org/problemnew/solution/P3009

JDOJ 2727: USACO 2011 Jan Silver 1.Profits

https://neooj.com/oldoj/problem.php?id=2727

题目描述

The cows have opened a new business, and Farmer John wants to see
how well they are doing. The business has been running for N (1 <=
N <= 100,000) days, and every day i the cows recorded their net
profit P_i (-1,000 <= P_i <= 1,000).

Farmer John wants to find the largest total profit that the cows
have made during any consecutive time period. (Note that a consecutive
time period can range in length from one day through N days.) Help
him by writing a program to calculate the largest sum of consecutive
profits.

输入

* Line 1: A single integer: N

* Lines 2..N+1: Line i+1 contains a single integer: P_i

输出

* Line 1: A single integer representing the value of the maximum sum
        of profits for any consecutive time period.

样例输入

7
-3
4
9
-2
-5
8
-3

样例输出

14

提示

OUTPUT DETAILS:

The maximum sum is obtained by taking the sum from the second through
the sixth number (4, 9, -2, -5, 8) => 14.

题意大致翻译如下:

奶牛们开始了新的生意,它们的主人约翰想知道它们到底能做得多好。这笔生意已经做了N(1≤N≤100,000)天,每天奶牛们都会记录下这一天的利润Pi(-1,000≤Pi≤1,000)。

约翰想要找到奶牛们在连续的时间期间所获得的最大的总利润。(注:连续时间的周期长度范围从第一天到第N天)。

请你写一个计算最大利润的程序来帮助他。

动态规划的基础题,相信大家都做过最大字段和的题目作为动归的入门题,其实这道题跟最大字段和的原理是一样的,奶牛在连续时间内获得的利润其实就是最大字段和,分析到这里就可以思路非常清晰地写出AC代码了:

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + ;
int dp[maxn],a[maxn],n;
int main()
{
cin>>n;
for(int i=;i<=n;++i)
cin>>a[i];
for(int i=;i<=n;++i)
dp[i] = max(dp[i-]+a[i],a[i]);
sort(dp+,dp+n+);
cout<<dp[n]<<endl;
return ;
}
 
05-21 21:25