天天看點

1057. 股票買賣 IV 狀态機模型 恰好體積類問題 動态規劃

題目

1057. 股票買賣 IV 狀态機模型 恰好體積類問題 動态規劃

題解思路

當買入時 總值 + w[ i ] 賣出時 總值 - w [ i ] 就自動換算利潤了

一開始沒看清

很自然的定義 f [ i ] [ j ] [ 0 ] 不持有 f [ i ] [ j ] [ 1 ] 持有

考慮前 i 天的股票,第 i 天的 決策 是 k ( 0 1 ),且完成的 完整交易數 為 j 的方案

再分析兩個狀态之間的互動情況 推出轉移方程

大細節

這裡是定義的 完整交易數 也就是恰好問題

真正的答案就需要再搜尋出來

而且初始化也要做好 (不然得不出答案 )

轉移起點初始為 0 無關非法 初始為 無窮 (max為負 min為正 )

參考文章

AC代碼

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#include <map>
#include <string>
using namespace std;

const  int  INF =  0x3f3f3f3f;

int f[10010][110][3];

int main ()
{
    ios::sync_with_stdio(false);
    memset(f, -0x3f, sizeof f);
    int n,m;
    cin>>n>>m;
    for (int i = 0 ; i <= n ; i++ )
        f[i][0][0] = 0 ;
    for (int i = 1 ; i <= n ; i++ )
    {
        int t;
        cin>>t;
        for (int j = m ; j >= 1  ; j-- )
        {
            f[i][j][0] = max( f[i-1][j][0] , f[i-1][j][1] + t );
            f[i][j][1] = max( f[i-1][j-1][0] - t , f[i-1][j][1] );
        }
    }
    int ans = 0 ;
    for (int i = 0 ; i <= m ; i++ )
        ans = max(f[n][i][0] , ans );
    cout<<ans<<"\n";
    return 0 ;
}