informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Tautan ke pertanyaan terkait:188. Waktu terbaik untuk membeli dan menjual saham IV - LeetCode
Tautan topik terkait Niuke:Waktu terbaik untuk membeli dan menjual saham (4)_Niuke Topic_Niuke.com (nowcoder.com)
Agar dapat membedakan dengan lebih jelasmembeliDanmenjual, kami menggantinya denganPunya sahamDantidak ada stokDua negara bagian.
- f[i][j] artinya: TIDAK. Saya Pada akhirnya, semuanya selesai J transaksi, saat ini masukPunya sahamManfaat sebesar-besarnya bagi negara.
- g[i][j] artinya: TIDAK. Saya Pada akhirnya, semuanya selesai J transaksi, saat ini masuktidak ada stokManfaat sebesar-besarnya bagi negara.
untuk F[aku j], ada juga dua situasi di mana Saya Setelah hari itu selesai, selesaikan J Sebuah transaksi, ada di tangan saat iniPunya sahamstatus:
- ada saya-1 Di langit, di tanganPunya saham, dan diperdagangkan J Kelas dua. Pada hari ke-i, jangan lakukan apa pun.Pendapatan saat ini adalah f[i] adalah singkatan dari [i] - 1 [j]。
- ada saya-1 Di langit, di tangantidak ada stok, dan diperdagangkan J Kelas dua.Yang pertamaSaya Saat matahari terbenam, saya membeli saham tiket.JadiSaya Pada akhirnya, ada stok.Pendapatan saat ini adalahg[i - 1][j] - harga[i]。
Dalam dua kasus di atas, yang kita butuhkan adalahnilai maksimum, jadi persamaan transisi keadaan f adalah:
f[i][j] = maks(f[i - 1][j], g[i - 1][j] - harga[i]
untuk G[aku j], kami memiliki dua situasi berikut di mana kami bisa Saya Setelah hari itu selesai, selesaikan J Sebuah transaksi, ada di tangan saat initidak ada stokstatus:
- ada saya-1 Pada hari itu, saya tidak memiliki saham apa pun dan saya memperdagangkannya. J Kelas dua.Pada hari ke-i, jangan lakukan apa pun .Pendapatan saat ini adalahhuruf g[i - 1][j]。
- ada saya-1 Pada hari itu, saya memiliki saham di tangan saya dan memperdagangkannya. j-1 Kelas dua.Yang pertamaSaya Saat cuaca cerah, taruh Stoknya telah terjual.JadiSaya Pada akhirnya, kami berdagang J Kelas dua.Pendapatan saat ini adalah f[i-1][j-1] adalah 1] + harga[i]。
Dalam dua kasus di atas, yang kita butuhkan adalahnilai maksimum,Karena itu G Persamaan transisi keadaan adalah:
g[i][j] = maks(g[i - 1][j], f[i - 1][j - 1] + harga[i])
Hubungan dagang antara keduanya adalah sebagai berikut:
Isi setiap baris dari atas ke bawah, setiap baris dari kiri ke kanan, dan isi kedua tabel secara bersamaan.
Mengembalikan nilai maksimum dalam keadaan menjual, tapi kita tidak tahu berapa kali diperdagangkan, sehingga kembali G Nilai maksimum pada baris terakhir tabel.
Jumlah transaksi kami tidak akan melebihi setengah dari jumlah hari keseluruhan, jadi kami bisa dulu aku Mari kita atasi dan optimalkan ukuran masalahnya:k = min(k, n / 2)。
- //力扣
- //【动态规划-二维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;
- }
Serangkaian pertanyaan seperti membeli dan menjual saham memerlukan pemahaman menyeluruh tentang poin-poin pengetahuan inti.