每次你购买股票时的股价一定要比你上次购买时的股价低.按照这个规则购买股票的次数越多越好,看看你最多能按这个规则买几次。
逢低吸纳,越低越买
给定连续的N天中每天的股价。你可以在任何一天购买一次股票,但是购买时的股价一定要比你上次购买时的股价低。写一个程序,求出最多能买几次股票。
以下面这个表为例, 某几天的股价是:
天数 1 2 3 4 5 6 7 8 9 10 11 12
股价 68 69 54 64 68 64 70 67 78 62 98 87
这个例子中, 聪明的投资者(按上面的定义),如果每次买股票时的股价都比上一次买时低,那么他最多能买4次股票。一种买法如下(可能有其他的买法):
天数 2 5 6 10
股价 69 68 64 62
题意:求最长单调递减子序列的长度以及有多少种途径到达该最长单调递减子序列。
思路:求最长单调递减子序列是比较容易的了,关键是求路径的条数。而且还要去重。如5 5 2 2 1,其实是只有一条5 2 1。该题难点就在于去重,去重方法如下:
我们在求单调递减子序列的时候,可以用一个二重for循环求,在循环中dp[i]表示的是到第i个数时的单调递减子序列的最长长度
#include<iostream>
using namespace std;
const int maxn=5005;
int dp[maxn],times[maxn],a[maxn],n,ans;
int main()
{
int i,j;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n;i++)
dp[i]=times[i]=1;
for(i=1;i<=n;i++)
for(j=i-1;j>0;j--) //从后往前,可以防止重复
{
if(a[i]<a[j])
{
if(dp[j]+1>dp[i])
{
dp[i]=dp[j]+1;
times[i] = times[j];
}
else if(dp[j]+1==dp[i])
times[i] += times[j];
}
else if(a[i]==a[j])
{
if(dp[i]==1) times[i]=0; //防止重复,因为重复的话,dp[i]==1,a[i],a[j]前面接的同样的
break;
}
}
int len=0,time=0;
for(i=1;i<=n;i++)
if(len<dp[i])
len=dp[i];
for(i=1;i<=n;i++)
if(dp[i]==len)
time += times[i];
cout<<len<<" "<<time<<endl;
}
return 0;
}
动规-Buy Low, Buy Lower
最新推荐文章于 2021-10-04 18:09:24 发布