对动归还是理解不扎实,碰见个题目就不会啊,又参考别人的博客才得到的思路,这个问题其实就是难找状态
用p数组储存前i天买卖的最大利润,用q数组储存后n-j+1天买卖的最大利润
用p数组储存前i天买卖的最大利润,用q数组储存后n-j+1天买卖的最大利润
以此计算两者加和,即在第i天前买,后卖得到的最大利润
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 100005;//n^2算法肯定超时
int m[N],p[N],q[N];
int main()
{
int t,n;
cin >> t;
while(t--)
{
cin >> n;
memset(p,0,sizeof(p));//记得输入后就清零,以免忘记
memset(q,0,sizeof(q));
for(int i = 1;i <= n;i++)
scanf("%d",&m[i]);
int minn = m[1];
p[1] = 0;
for(int i = 2;i <= n;i++)
{
minn = min(m[i],minn);
p[i] = max(p[i-1],m[i]-minn);
}
int maxn = m[n];
q[n] = 0;
for(int i = n-1;i >=1;i--)
{
maxn = max(m[i],maxn);
q[i] = max(q[i+1],maxn-m[i]);
}
int money = 0;
for(int i = 1;i <= n;i++)
money = max(p[i-1]+q[i],money);
money =max(money,0);//如果最后小于0,就选择入手就卖的方法
printf("%d\n",money);
}
return 0;
}