动态规划
方程:
前i天最大收益=max{前i-1天最大收益,第i天的价钱-前i-1天的最小值}
c++实现
#include<bits/stdc++.h>
using namespace std;
int N;
int array[1000];
int ans;
int minarr(int array[], int a,int b){ //a,b之间的最小值,有a有b
int temp=999;
for(int i=a;i<=b;i++){
if(array[i]<temp){
temp=array[i];
}
}
return temp;
}
int max(int a,int b){
return a>b?a:b;
}
int dp(int array[], int n){
if(n==1){
return array[1]-array[0];
}else{
return max(0, max(dp(array, n-1), array[n]-minarr(array,0,n-2)));
}
}
int main(){
cin>>N;
for(int i=0;i<N;i++){
cin>>array[i];
}
ans=dp(array,N-1);
// if(ans<0){
// cout<<0;
// }else{
// cout<<ans;
// }
cout<<ans;
return 0;
}
但是上述代码没法转进leetcode的系统里。。。
leetcode是用vector模板实现的,
引用一个leetcode里能跑的代码,把递归用迭代实现,速度更快。
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size()<=1) return 0;
vector<int> maxp(prices.size());
maxp[0] =0;
maxp[1]=prices[1]-prices[0];
int min=prices[0];
for(int i=2;i<prices.size();i++){
min=prices[i-1]<min?prices[i-1]:min;
maxp[i]=max(maxp[i-1],prices[i]-min);
}
// return max(0, maxp[prices.size()-1]);
return maxp[prices.size()-1]>0?maxp[prices.size()-1]:0;
}
};
这里面需要注意的是,三元运算符的速度高于max重载函数