2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
तत्सम्बद्धप्रश्नस्य लिङ्क् : १.188. स्टॉकस्य क्रयणविक्रयस्य सर्वोत्तमः समयः IV - LeetCode
नियुके इत्यस्य तत्सम्बद्धः विषयः लिङ्कः : १.स्टॉक्स् क्रयणविक्रययोः सर्वोत्तमः समयः (4)_Niuke Topic_Niuke.com (nowcoder.com)
अधिकं स्पष्टतया भेदं कर्तुंक्रीडातुतथाविक्रयिन्, वयं तस्य स्थाने स्थापयामःस्टॉक्स् भवन्तितथान स्टॉक्राज्यद्वयम् ।
- च[इ][ज] इत्यर्थः: नहि। अहम् दिनान्ते, कृतं भवति झ व्यवहारः, सम्प्रतिस्टॉक्स् भवन्तिराज्यस्य अधिकतमः लाभः।
- ग[इ][ज] इत्यर्थः: नहि। अहम् दिनान्ते, कृतं भवति झ व्यवहारः, सम्प्रतिन स्टॉक्राज्यस्य अधिकतमः लाभः।
कृते च[इ][ज्] २., द्वे अपि परिस्थितौ स्तः येषु द अहम् दिवसस्य समाप्तेः अनन्तरं सम्पूर्णम् झ एकः व्यवहारः, अस्मिन् समये हस्तेस्टॉक्स् भवन्तिस्थितिः:
- अस्ति i-1 आकाशे हस्तेस्टॉक्स् भवन्ति, व्यापारं च कृतवान् झ द्वितीय-श्रेणी। इ-दिने किमपि न कुरु ।अस्मिन् समये आयः अस्ति च[इ - १][ज] ।。
- अस्ति i-1 आकाशे हस्तेन स्टॉक्स्, व्यापारं च कृतवान् झ द्वितीय-श्रेणी।प्रथमेअहम् यदा सूर्यः पतितः तदा अहं भागं क्रीतवन् आसीत् टिकटम् ।अतःअहम् दिनान्ते स्टॉक्स् भवन्ति ।अस्मिन् समये आयः अस्तिg[i - 1][j] - मूल्यानि[i] .。
उपर्युक्तयोः प्रकरणयोः अस्माकं यत् आवश्यकं तत् अस्तिअधिकतमं मूल्यम्, अतः f इत्यस्य अवस्थासंक्रमणसमीकरणम् अस्ति : १.
f[i] [j] = अधिकतम(च[i - 1] [ज], g[i - 1] [ज] - मूल्य[i]
कृते छ[इ][ज्] २., अस्माकं निम्नलिखितौ परिस्थितौ स्तः यत्र वयं शक्नुमः अहम् दिवसस्य समाप्तेः अनन्तरं सम्पूर्णम् झ एकः व्यवहारः, अस्मिन् समये हस्तेन स्टॉक्स्स्थितिः:
- अस्ति i-1 दिने मम हस्ते किमपि स्टॉक् नासीत्, अहं तान् व्यापारितवान् । झ द्वितीय-श्रेणी।इ-दिने किमपि न कुरु .अस्मिन् समये आयः अस्तिग[इ - १][ज] ।。
- अस्ति i-1 दिने मम हस्तेषु स्टॉक्स् आसीत्, तेषां व्यापारः अपि कृतः । ञ - १ द्वितीय-श्रेणी।प्रथमेअहम् यदा सूर्य्यः भवति तदा स्थापयतु स्टॉकः विक्रीतवान् ।अतःअहम् दिनान्ते वयं व्यापारं कुर्मः झ द्वितीय-श्रेणी।अस्मिन् समये आयः अस्ति च[इ - १][ज - ९. १] + मूल्यानि[इ] ।。
उपर्युक्तयोः प्रकरणयोः अस्माकं यत् आवश्यकं तत् अस्तिअधिकतमं मूल्यम्,अतएव छ इत्यस्य अवस्थासंक्रमणसमीकरणम् अस्ति : १.
g[i][j] = अधिकतम(g[i - 1][j], f[i - 1][j - 1] + मूल्य[i])
तेषां मध्ये व्यापारसम्बन्धः यथा भवति ।
प्रत्येकं पङ्क्तिं उपरि अधः, प्रत्येकं पङ्क्तिं वामतः दक्षिणं यावत् पूरयित्वा, द्वयोः सारणीयोः एकत्र पूरयन्तु ।
विक्रयस्थितौ अधिकतमं मूल्यं प्रत्यागच्छति, परन्तु वयं न जानीमः यत् कियत्वारं तस्य व्यापारः अभवत्, अतः इदं प्रत्यागच्छति छ सारणीयाः अन्तिमपङ्क्तौ अधिकतमं मूल्यम् ।
अस्माकं व्यवहारसङ्ख्या सम्पूर्णदिनसङ्ख्यायाः अर्धाधिका न भविष्यति, अतः प्रथमं शक्नुमः k तस्य निवारणं कुर्मः समस्यायाः आकारं च अनुकूलितं कुर्मः :क = मिन्(क्, न / २) २.。
- //力扣
- //【动态规划-二维dp-2个状态】
- class Solution {
- //f[i][j]:第i天结束后,完成了j次交易,此时处于“买入”状态下的最大利润
- //g[i][j]:第i天结束后,完成了j次交易,此时处于“卖出”状态下的最大利润
- private:
- const int INF=0x3f3f3f3f;
- public:
- int maxProfit(int k, vector<int>& prices) {
- int n=prices.size();
- k=min(k, n/2); //优化:处理最多交易次数
- vector<vector<int>> f(n, vector<int>(k+1, -INF));
- vector<vector<int>> g(n, vector<int>(k+1, -INF));
- f[0][0]=-prices[0], g[0][0]=0;
- for(int i=1; i<n; i++)
- {
- for(int j=0; j<=k; j++)
- {
- f[i][j]=max(f[i-1][j], g[i-1][j]-prices[i]);
- g[i][j]=g[i-1][j];
- if(j>=1) g[i][j]=max(g[i][j], f[i-1][j-1]+prices[i]);
- }
- }
- int res=0;
- for(int j=0; j<=k; j++)
- res=max(res, g[n-1][j]);
- return res;
- }
- };
-
- //【动态规划-二维dp-2k+1个状态】
- class Solution {
- //dp[i][0] -- 没有操作
- //下面j为奇数:买入;j为偶数:卖出 (j的范围:1~2k-1)
- //dp[i][j] -- 第1~k次买入
- //dp[i][j+1] -- 第1~k次卖出
- public:
- int maxProfit(int k, vector<int>& prices) {
- int n=prices.size();
- vector<vector<int>> dp(n, vector<int>(2*k+1));
- for(int j=1; j<2*k; j+=2)
- dp[0][j]=-prices[0];
- for(int i=1; i<n; i++)
- {
- for(int j=0; j<2*k; j+=2)
- {
- dp[i][j+1]=max(dp[i-1][j+1], dp[i-1][j]-prices[i]);
- dp[i][j+2]=max(dp[i-1][j+2], dp[i-1][j+1]+prices[i]);
- }
- }
- return dp[n-1][2*k];
- }
- };
- //牛客
- #include <iostream>
- #include <cstring>
- using namespace std;
-
- const int INF=0x3f3f3f3f;
- const int N=1010, M=110;
- int prices[N];
- int f[N][M], g[N][M];
- //f[i][j]:第i天结束后,完成了j次交易,此时处于“买入”状态下的最大利润
- //g[i][j]:第i天结束后,完成了j次交易,此时处于“卖出”状态下的最大利润
-
- int main()
- {
- int n, k;
- cin >> n >> k;
- for(int i=0; i<n; i++)
- cin >> prices[i];
- memset(f, -INF, sizeof(f));
- memset(g, -INF, sizeof(g));
- int res=0;
- f[0][0]=-prices[0], g[0][0]=0;
- for(int i=1; i<n; i++)
- {
- for(int j=0; j<=k; j++)
- {
- f[i][j]=max(f[i-1][j], g[i-1][j]-prices[i]);
- g[i][j]=g[i-1][j];
- if(j>0) g[i][j]=max(g[i][j], f[i-1][j-1]+prices[i]);
- res=max(res, g[i][j]);
- }
- }
- cout << res << endl;
- return 0;
- }
-
- //值得学习的代码
- #include <iostream>
- using namespace std;
-
- const int N = 1010, M = 110;
-
- int n, k, p[N];
- int f[N][M], g[N][M];
-
- int main()
- {
- cin >> n >> k;
- for(int i = 0; i < n; i++) cin >> p[i];
-
- k = min(k, n / 2);
- for(int j = 0; j <= k; j++) f[0][j] = g[0][j] = -0x3f3f3f3f;
- f[0][0] = -p[0], g[0][0] = 0;
-
- for(int i = 1; i < n; i++)
- {
- for(int j = 0; j <= k; j++)
- {
- f[i][j] = max(f[i - 1][j], g[i - 1][j] - p[i]);
- g[i][j] = g[i - 1][j];
- if(j >= 1) g[i][j] = max(g[i][j], f[i - 1][j - 1] + p[i]);
- }
- }
-
- int ret = 0;
- for(int j = 0; j <= k; j++) ret = max(ret, g[n - 1][j]);
-
- cout << ret << endl;
-
- return 0;
- }
स्टॉकक्रयणविक्रयादिप्रश्नानां श्रृङ्खलायां मूलज्ञानबिन्दुभिः सह सम्यक् परिचितता आवश्यकी भवति ।