买卖股票的最好时机(一):最直观的想法是,动态规划。交易一次*是否持股一共有两种状态,分别使用dp[i][0]表示第i天持股,使用dp[i][1]表示第i天不持股,然后根据常识对第一天的两种状态进行初始化,接着从第二天开始遍历,分别更新递推公式,其中第i天持股可能是第i-1天就持股或者第i-1天不持股而第i天买入,由于只能买卖一次,故此处为0而不是dp[i-1][1],第i-1天不持股可能是第i-1天就不持股或者第i-1天持股而第i-1天卖出,最后返回第n-1天不持股状态即为最大收益。
int maxProfit(vector<int>& prices) { int n=prices.size(); // 处理空数组 if(n==0||n==1) return 0; // dp[i][0]表示第i天持股 dp[i][1]表示第i天不持股 vector<vector<int>> dp(n,vector<int>(2,0)); dp[0][0]=-prices[0]; dp[0][1]=0; for(int i=1;i<n;i++) { // 第i天持股可能是第i-1天就持股或者第i-1天不持股而第i天买入 // 由于只能买卖一次 故此处是0而不是dp[i-1][1] dp[i][0]=max(dp[i-1][0],0-prices[i]); // 第i天不持股可能是第i-1天就不持股或者第i-1天持股而第i天卖出 dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i]); } // 最大的即是第n-1天不持股 return dp[n-1][1]; }