题目
题解思路
当买入时 总值 + 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 ;
}