首页 > 其他分享 >题解:SP19382 STK - Stock

题解:SP19382 STK - Stock

时间:2024-10-02 17:36:11浏览次数:7  
标签:int 题解 price SP19382 long 利润 operatorname dp Stock

一道动态规划题。

先分析状态。

  • \(dp_{i\operatorname{and}1,k}\):表示在第 \(i\) 天最多进行 \(k\) 次交易的最大利润。
  • \(s_{i\operatorname{and}1,k}\):表示在第 \(i\) 天之前的某天卖出之后,最多进行 \(k-1\) 次交易的最大利润减去当天的价格。

接下来分析转移方程

  • 当 \(i=0\) 时,表示在第 \(0\) 天,没有进行任何交易,所以利润为 \(0\),\(s\) 初始化为 INT_MIN,表示不可能的状态。
  • 当 \(k=0\) 时,表示没有进行任何交易,所以利润为 \(0\),\(s\) 初始化为 INT_MIN。
  • 其他情况下,通过以下状态转移公式:
    1. \(s_{i\operatorname{and}1,k} = \max(dp_{(i-1)\operatorname{and}1,k-1} - price_{i-1}, s_{(i-1)\operatorname{and}1,k}\):表示在第 \(i\) 天最多进行 \(k\) 次交易的最大利润,这个最大利润要么来自于前一天最多进行 \(k-1\) 次交易并且在第 \(i-1\) 天买入,要么来自于前一天的同一状态。
    2. \(dp_{i\operatorname{and}1,k} = \max(dp_{(i-1)\operatorname{and}1,k}, s_{i\operatorname{and}1,k} + price_i)\):表示在第 \(i\) 天卖出时的最大利润,要么不交易维持前一天的最大利润,要么在第 \(i\) 天卖出并且之前有一次有效的交易。

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int t,n,p;
	cin>>p;
	long long price[3003];
	while(p--) {
		cin>>n>>t;
		for(int i=0; i<n; i++)
			cin>>price[i];
		long long dp[2][t+1];
		long long s[2][t+1];
		for(int i=0; i<n; i++) {
			for(int k=0; k<=t; k++) {
				if(i==0)
					dp[0][k]=0,s[0][k]=INT_MIN;
				else if(k==0)
					dp[i&1][0]=0,s[i&1][0]=INT_MIN;
				else {
					s[i&1][k]=max(dp[(i-1)&1][k-1]-price[i-1],s[(i-1)&1][k]);
					dp[i&1][k]=max(dp[(i-1)&1][k],s[i&1][k]+price[i]);
				}
			}

		}
		cout<<dp[(n-1)&1][t]<<'\n';
	}
	return 0;
}

标签:int,题解,price,SP19382,long,利润,operatorname,dp,Stock
From: https://www.cnblogs.com/cly312/p/18444900

相关文章

  • 题解:SP23875 DCEPC14A - Another Version of Inversion
    我们注意到这道题是二维的,所以要用到二维树状数组,不会的可以看一下这篇文章。这题的思路和P1908很像,按价值从大到小排序,排完序之后用树状数组维护,每次把这个数的位置加入到树状数组中,因为是排完序之后,所以之前加入的一定比后加入的大,然后在查询当前这个数前面位置的数(是前面位......
  • 题解:SP20038 SNGLOOP1 - Easiest Loop 1
    数学题。根据题目中给出的等式:\[(2n+3)(p-1)+\frac{4}{5}[(p\cdot{S}_{n})-{S}_{m}]=2(m-n)\]变形:\[(10n+15)(p-1)+4[(p\cdot{S}_{n})-{S}_{m}]=10m-10n\]\[(10m+15)p-10m-15+4{S}_{n}p-4{S}_{m}=10m-10n\]\[(10m+15+4{S}_{n})p=10m+15+4{S}_{m}\]\[p=\frac{10m+15+4{S}......
  • 题解:P1701 [USACO19OPEN] Cow Evolution B
    这题的关键就在于能否将问题转化成集合之间是否有交集。首先,考虑一个我们无法形成进化树的例子,例如这样:31fly1man2flyman如果我们想根据这个输入构建一棵树,我们需要在根上分割A或B,但剩下的两个子树都需要有一条边来添加另一个特征。显然输出为"No"。如果我们输入......
  • 题解:SP4555 ANARC08F - Einbahnstrasse
    一道多源最短路问题,肯定用Floyd,还有个问题就是怎么处理输入。使用sscanf(edge+2,"%d",&cost);从edge的第三个字符开始读取边权,然后处理左右两侧的箭头即可。#include<bits/stdc++.h>usingnamespacestd;map<string,int>cn;intct;intq[1028];intadd_city(constch......
  • 题解2:SP5449 ANARC09A - Seinfeld
    思路:考虑贪心。统计未配对的{:当遇到一个{时,增加未配对的{数量。当遇到一个}时,有两种情况:如果有多余的{,那么就用这个}与之前的{配对。如果没有多余的{,增加\(1\)次。遍历结束后:当我们遍历完字符串后,可能还会剩下一些未配对的{,需要通过将一部分{......
  • 题解:SP5449 ANARC09A - Seinfeld
    可以用动态规划解决。动态规划思想:设\(dp_{i,j}\)表示处理到字符串的第\(i\)个字符,并且未配对的{数量为\(j\)时,所需的最小操作次数。状态转移:初始化:\(dp_{0,0}=0\):表示空字符串且没有未配对的{,显然不需要任何操作。其他所有\(dp_{0,j}\)初始化为INF,表示不......
  • 题解:SP1703 ACMAKER - ACM (ACronymMaker)
    题目大意:一个有一些单词组成的短语,给定一个缩写词,求此缩写由此短语的单词组成的可能方案数。注意,短语中所有重要的单词都要用到,顺序必须和缩写词单词顺序一致。思路动态规划设置:\(dp_{i,j}\):使用前\(i\)个重要单词形成前\(j\)个缩写字符的方法数。\(dp2_{k,m}\):辅助数组......
  • 题解:SP4557 ANARC08H - Musical Chairs
    约瑟夫问题,由于问题涉及大量的删除和查找操作,直接用数组模拟会超时,可以用树状数组题意在每一轮游戏中,我们需要从当前的孩子位置开始数数,并淘汰第\(D\)个孩子。游戏需要不断地从剩下的孩子中进行选择并淘汰,直到只剩下最后一个孩子。注意两个点将树状数组的位置设为\(1\)......
  • 59_初识搜索引擎_搜索相关参数梳理以及bouncing results问题解决方案
    1、preference决定了哪些shard会被用来执行搜索操作_primary,_primary_first,_local,_only_node:xyz,_prefer_node:xyz,_shards:2,3bouncingresults问题,两个document排序,field值相同;不同的shard上,可能排序不同;每次请求轮询打到不同的replicashard上;每次页面上看到的搜索......
  • 操作系统错题解析【软考】
    目录前言1.特殊的操作系统1.1可移植性1.2嵌入式操作系统2.进程的状态2.1调度方式2.2进程通信运行实例3.信号量的取值范围3.1PV操作中信号量分析4.信号量于PV操作4.1PV操作4.2初值5.死锁资源数计算6.进程资源图7.页式存储8.段页式存储9.磁盘管理9.1计算读取时间9.2......