蓝桥杯——X额宝
题目描述
【理财有风险,投资需谨慎】
Alice计划将自己的所有红包拿去投资。
在粗略预测了该理财产品的各日收益后,Alice希望通过一次买卖获得最大的收益。
买卖当天均可以享受到当日盈亏,允许一天内先买后卖。
希望你帮她计算一下最大盈利。
Alice计划将自己的所有红包拿去投资。
在粗略预测了该理财产品的各日收益后,Alice希望通过一次买卖获得最大的收益。
买卖当天均可以享受到当日盈亏,允许一天内先买后卖。
希望你帮她计算一下最大盈利。
输入
第一行是样例个数K(1<=K<=100)
每个样例的第一行是天数N(1<=N<=100)
第二行包含N个整数Ai(-100<=Ai<=100),表示当天盈亏。
每个样例的第一行是天数N(1<=N<=100)
第二行包含N个整数Ai(-100<=Ai<=100),表示当天盈亏。
输出
对于每个样例,输出一个数字表示Alice的最大盈利。
如果该理财产品赚不到钱,她也可以选择不购入此产品,请直接输出0。
如果该理财产品赚不到钱,她也可以选择不购入此产品,请直接输出0。
样例输入 Copy
4
3
1 0 0
9
-2 1 -3 4 -1 2 1 -5 4
6
-4 -1 5 -4 1 -1
3
-9 -9 -6
样例输出 Copy
1
6
5
0
【分析】
“Alice希望通过一次买卖获得最大的收益“ —— 可能间隔好几天,某天买,另一天卖 。 显然用动态规划做
先定义一个dp的数组变量,以n为长度,从dp[1]开始进行一次for循环(ps:如果从0开始会导致数组越界),利用max函数判断是当前的a[i]大还是上一个dp加上当前的a[i]之和大,即max(a[i],dp[i-1]+a[i]);找出两者中较大的一个,作为当前dp[i]中的内容【记忆当前最好的情况】。 之后再做一次i从0到9的for循环,找出最终最大的一个和。
#include<bits/stdc++.h> using namespace std; int main() { int k,i,n,j; scanf("%d",&k); for(i=0;i<k;i++) { scanf("%d",&n); int a[n]={0},dp[n]={0}; for(j=0;j<n;j++) { scanf("%d",&a[j]); } int l; dp[0]=a[0]; for(l=1;l<n;l++) { dp[l]=max(a[l],dp[l-1]+a[l]); } int m=dp[0]; for(j=0;j<n;j++) { m=max(m,dp[j]); } if(m>0) printf("%d\n",m); else { printf("0\n"); } } }
# 最近做题越来越吃力了,遇到各种 dfs搜索,dp,没学习就直接上来刷题,效率极低,得改改。