【HDU】 3401

【HDU】 3401

Limite de temps: 2000/1000 MS (Java / autres)
Limite de mémoire: 32768/32768 K (Java / autres)

Description du problème

Récemment, lxhgww est accro au stock, il trouve des patrons réguliers après quelques jours d'étude.
Il prévoit le marché boursier des T prochains jours. Le i'ème jour, vous pouvez acheter une action avec le prix APi ou vendre une action pour obtenir BPi.
Il y a d'autres limites, on peut acheter dans la plupart des actions ASi le ième jour et tout au plus vendre des actions BSi.
Deux jours de négociation devraient avoir un intervalle de plus de W jours. Autrement dit, supposons que vous ayez négocié (tout achat ou vente d'actions est considéré comme une transaction) le ième jour, le jour de négociation suivant doit être le (i + W + 1) ème jour ou plus tard.
De plus, on ne peut pas posséder plus d'actions MaxP à tout moment.

Avant le premier jour, lxhgww a déjà infiniment d'argent mais pas d'actions, bien sûr, il veut gagner autant d'argent que possible sur le marché boursier. Alors la question se pose, combien au plus peut-il gagner?

Saisir

La première ligne est un entier t, le numéro de cas.
La première ligne de chaque cas est constituée de trois entiers T, MaxP, W.
(0 <= W <T <= 2000, 1 <= MaxP <= 2000).
Les T lignes suivantes ont chacune quatre entiers APi , BPi , ASi , BSi (1 <= BPi <= APi <= 1000,1 <= ASi, BSi <= MaxP), qui sont mentionnés ci-dessus.

Production

Le plus d'argent que lxhgww peut gagner.

Exemple d'entrée

1
5 2 0
2 1 1 1
2 1 1 1
3 2 1 1
4 3 1 1
5 4 1 1

Exemple de sortie

3

Traduction

commerce

Limite de temps: 2000/1000 MS (Java / autre)
Limite de mémoire: 32768/32768 K (Java / autre)

Description du problème

Récemment, lxhgww est accro aux actions et après plusieurs jours de recherche, il a trouvé des modèles réguliers.
Il prédit le marché boursier dans les T prochains jours. Le i jour, vous pouvez acheter une action au prix d'API ou vendre une action pour obtenir du BPi.
Il existe d'autres restrictions, c'est-à-dire que la plupart des actions ASi peuvent être achetées le i-ème jour et que les actions BSi peuvent être vendues au maximum.
L'intervalle entre deux jours de bourse doit être supérieur à W jours. En d'autres termes, supposons que vous ayez effectué une transaction le i-ième jour (tout achat ou vente d'actions est considéré comme une transaction), puis le jour de négociation suivant doit être effectué le (i + W + 1) jour ou plus tard.
De plus, vous ne pouvez à tout moment posséder que des actions MaxP.

Avant le premier jour, lxhgww disposait de fonds illimités, mais pas d'actions. Bien sûr, il espère gagner le plus d'argent possible sur le marché boursier. La question est donc de savoir combien d'argent peut-il gagner au maximum?

Entrer

La première ligne est l'entier t, qui est le numéro de cas.
La première ligne dans chaque cas est constituée de trois entiers T, MaxP et W.
(0 <= W <T <= 2000, 1 <= MaxP <= 2000).
Les lignes T suivantes ont chacune quatre entiers APi, BPi, ASi, BSi (1 <= BPi <= APi <= 1000, 1 <= ASi, BSi <= MaxP).

Production

lxhgww peut gagner le plus d'argent.

Exemple d'entrée

1
5 2 0
2 1 1 1
2 1 1 1
3 2 1 1
4 3 1 1
5 4 1 1

Exemple de sortie

3

Idées

Utilisez DP comme
équation de transition d'état:

f[i][j]=max(f[i-1][j],max(f[r][k]-AP[i]*(j-k))(0<r<i-w,k<j),max(f[r][k]+BP[i]*(k-j))(0<r<i-w,k>j))

Le
max (DP [R & lt] [K] -AP [I] (JK))
max (DP [R & lt] [K] sur BP + [I]
(kJ)) en
utilisant des files d’optimisation monotones

Code

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int f[2010][2010],s[2010],x[2010],ap[2010],bp[2010],as[2010],bs[2010];
int main()
{
    
    
	int T,n,maxp,w,i,j,l,r,ans;
	for(scanf("%d",&T);T;T--)
	{
    
    
		scanf("%d%d%d",&n,&maxp,&w);
		memset(f,0xcf,sizeof(f));//置最小值 
		for(ans=-0x7f7f7f7f,i=1;i<=n;i++) 
			scanf("%d%d%d%d",&ap[i],&bp[i],&as[i],&bs[i]);
		for(i=1;i<=w+1;i++)
			for(j=0;j<=as[i];j++) 
				f[i][j]=-ap[i]*j;//初始化
		for(i=2;i<=n;i++)
		{
    
    
			for(j=0;j<=maxp;j++)//不买卖的价值 
				f[i][j]=max(f[i][j],f[i-1][j]);
			if(i>w+1)//能买卖时
			{
    
    
				for(l=r=1,j=0;j<=maxp;j++)//枚举买件数 
				{
    
    
					for(;l<r&&s[r-1]<f[i-w-1][j]+ap[i]*j;r--);//删除小于当前价值的数 
					s[r]=f[i-w-1][j]+ap[i]*j,x[r]=j;//加入队列
					for(r++;l<r&&x[l]+as[i]<j;l++);//删除超限的数
					f[i][j]=max(f[i][j],s[l]-ap[i]*j);
				}
				for(l=r=1,j=maxp;j>=0;j--)//枚举卖件数
				{
    
    
					for(;l<r&&s[r-1]<f[i-w-1][j]+bp[i]*j;r--);//删除小于当前价值的数
					s[r]=f[i-w-1][j]+bp[i]*j,x[r]=j;//加入队列
					for(r++;l<r&&x[l]-bs[i]>j;l++);//删除超限的数
					f[i][j]=max(f[i][j],s[l]-bp[i]*j);
				}
			}
		}
		for(i=0;i<=maxp;i++)//找最大值 
			ans=max(ans,f[n][i]);
		printf("%d\n",ans);
	}
	return 0;
}

Je suppose que tu aimes

Origine blog.csdn.net/weixin_46975572/article/details/114671792
conseillé
Classement