ពេលវេលាល្អបំផុតក្នុងការទិញនិងលក់ភាគហ៊ុនជាមួយសូលុយស្យុងឡេឡេតូសូលូសិន


កម្រិតលំបាក មធ្យម
សួរញឹកញាប់ កម្មវិធី Adob ​​e ក្រុមហ៊ុន Amazon ក្រុមហ៊ុន Goldman Sachs ក្រុមហ៊ុន Yahoo
ការសរសេរកម្មវិធីឌីណាមិក

សេចក្តីថ្លែងការណ៍បញ្ហា

នៅក្នុងបញ្ហា“ ពេលវេលាល្អបំផុតដើម្បីទិញនិងលក់ភាគហ៊ុនជាមួយខូឡូលថោន” យើងត្រូវបានផ្តល់នូវអារេដែលធាតុនីមួយៗនៅក្នុងអារេមានតំលៃនៃភាគហ៊ុនដែលបានផ្តល់នៅថ្ងៃនោះ។

មិនមានការរឹតត្បិតលើចំនួននៃប្រតិបត្តិការទេ។ និយមន័យនៃប្រតិបត្តិការគឺការទិញភាគហ៊ុនមួយចំណែកហើយលក់ភាគហ៊ុនមួយភាគហ៊ុននោះ។

ភារកិច្ចរបស់យើងគឺស្វែងរកប្រាក់ចំណេញអតិបរមាក្រោមការរឹតបន្តឹងដូចខាងក្រោម៖

  1. យើងមិនអាចទិញភាគហ៊ុនថ្មីបានទេប្រសិនបើយើងមិនបានលក់ភាគហ៊ុនមុន។ នោះគឺនៅក្នុងពេលមួយដែលយើងអាចមានភាគហ៊ុនភាគច្រើន។
  2. ប្រសិនបើយើងលក់ភាគហ៊ុននៅថ្ងៃ ១០ ថ្ងៃនោះយើងមិនអាចទិញភាគហ៊ុននៅថ្ងៃទី ១ (i + ១) បានទេ។ នោះគឺរយៈពេល ១ ថ្ងៃនៃរយៈពេលរួមរស់

ឧទាហរណ៍

prices = [1,2,3,0,2]
3

ការពន្យល់: ប្រាក់ចំនេញអតិបរិមាដែលអាចទទួលបានគឺ ៨ ។

ថ្ងៃដំបូង: ទិញ

ថ្ងៃទីពីរៈលក់

ថ្ងៃទី ៣ ៈ cooldown

ថ្ងៃទីបួន: ទិញ

ថ្ងៃទីប្រាំ: លក់

វិធីសាស្រ្តសម្រាប់ពេលវេលាដ៏ល្អបំផុតដើម្បីទិញនិងលក់ភាគហ៊ុនជាមួយនឹងដំណោះស្រាយខូឡូលែនឡឺកូដ

ដើម្បីដោះស្រាយបញ្ហានេះយើងត្រូវកត់សំគាល់ចំណុចមួយចំនួន៖

  1. រាល់ពេលដែលយើងចង់លក់ភាគហ៊ុនយើងត្រូវតែទិញភាគហ៊ុនមុន។ មានន័យថាការលក់ភាគហ៊ុនគឺពឹងផ្អែកលើការទិញភាគហ៊ុន។
  2. មួយថ្ងៃនៃរយៈពេលរួមរស់គឺជាកត្តាចាំបាច់។ ដូច្នេះការទិញភាគហ៊ុនគឺអាស្រ័យលើរយៈពេលសហករណ៍។

ដោយចងចាំចំណុចទាំងនេះយើងអាចកំណត់រដ្ឋៈ

  • រដ្ឋ - A: នៅក្នុងរដ្ឋនេះយើងអាចទិញភាគហ៊ុនឬគ្រាន់តែសម្រាក។
  • រដ្ឋប៊ី - ខ: បន្ទាប់ពីទិញភាគហ៊ុនយើងអាចលក់ភាគហ៊ុនបានឬគ្រាន់តែយកនៅសល់។
  • រដ្ឋ - ស៊ី: នេះគឺជារដ្ឋដែលមានសហករណ៍។ នៅពេលដែលរយៈពេលរួមរស់ចប់ហើយយើងផ្លាស់ទៅរស់នៅរដ្ឋអេសអេ។

ពេលវេលាល្អបំផុតដើម្បីទិញនិងលក់ភាគហ៊ុនជាមួយខូឡូលែន

ទំនាក់ទំនងរវាងរដ្ឋទាំងបីនេះអាចប្តូរទៅជាអា កន្សោមពិជគណិត កន្លែងដែល STATE-X [i] តំណាងអោយប្រាក់ចំណេញអតិបរមារហូតដល់ថ្ងៃគិតជាថ្ងៃនៅរដ្ឋ x ។

sa->STATE-A,sb->STATE-B,sc->STATE-C
 sa[i]=max(sa[i-1],sc[i-1]);
 sb[i]=max(sb[i-1],sa[i-1]-prices[i]);
 sc[i]=sb[i-1]+prices[i];

បន្ទាប់ពី n ការរកប្រាក់ចំណេញអតិបរិមានឹងមានអតិបរមា (sa [n-1], sc [n-1] ពីព្រោះពីព្រោះយើងចង់រកប្រាក់ចំណេញឱ្យបានច្រើនបំផុតដូច្នេះយើងនឹងមិនបញ្ចប់ការទិញភាគហ៊ុនហើយមិនលក់វាទេ

ករណីមូលដ្ឋាន៖

sa[0]=0;
sb[0]=-prices[0]
sc[0]=INT_MIN

ការអនុវត្តន៍

កូដ C ++ សម្រាប់ពេលវេលាល្អបំផុតដើម្បីទិញនិងលក់ភាគហ៊ុនជាមួយខូឡូលថោន

#include <bits/stdc++.h> 
using namespace std; 
    int maxProfit(vector<int>& prices) {
        int n=prices.size();
        if(n<1)return 0;
       int sa[n],sb[n],sc[n];
        sa[0]=0,sb[0]=-prices[0],sc[0]=INT_MIN;
        for(int i=1;i<n;i++)
        {
            sa[i]=max(sa[i-1],sc[i-1]);
            sb[i]=max(sb[i-1],sa[i-1]-prices[i]);
            sc[i]=sb[i-1]+prices[i];
        }
        return max(sa[n-1],sc[n-1]);  
    }
int main() 
{ 
 vector<int> arr = { 1,2,3,0,2 }; 
 cout<<maxProfit(arr)<<endl; 
 return 0;
}
3

កូដចាវ៉ាសម្រាប់ពេលវេលាល្អបំផុតដើម្បីទិញនិងលក់ភាគហ៊ុនជាមួយខូឡូលថោន

import java.util.Arrays; 
public class Tutorialcup {
    public static int  maxProfit(int[] prices) {
          int n=prices.length;
    if(n<1)return 0;
    int[] sa = new int[n];
    int[] sb = new int[n];
    int[] sc = new int[n];
    sa[0] = 0;sb[0] = -prices[0]; sc[0] = Integer.MIN_VALUE;

    for (int i = 1; i < n; ++i) {
      sa[i] = Math.max(sa[i-1],sc[i-1]);
      sb[i] = Math.max(sb[i-1],sa[i-1]-prices[i]);
      sc[i] = sb[i-1]+prices[i];
    }

    return Math.max(sa[n-1],sc[n-1]);  
    }
  public static void main(String[] args) {
    int [] arr = {1,2,3,0,2}; 
    int ans=  maxProfit(arr);
    System.out.println(ans);
  }
}
3

ការវិភាគភាពស្មុគស្មាញនៃពេលវេលាល្អបំផុតដើម្បីទិញនិងលក់ភាគហ៊ុនជាមួយនឹងដំណោះស្រាយខូឡូលែនឡេតកូដ

ភាពស្មុគស្មាញពេលវេលា

ពេលវេលាស្មុគស្មាញនៃលេខកូដខាងលើគឺ អូរ (n) ពីព្រោះយើងកំពុងឆ្លងកាត់ការតំឡើងតំលៃតែម្តង។ នៅទីនេះ n គឺជាប្រវែងនៃអារេតំលៃ។

ភាពស្មុគស្មាញនៃលំហ

ភាពស្មុគស្មាញចន្លោះនៃលេខកូដខាងលើគឺ អូរ (n) ពីព្រោះយើងប្រើអារេមួយដើម្បីរក្សាទុកព័ត៌មានរបស់រដ្ឋផ្សេងៗ។

ឯកសារយោង