故事背景
在提瓦特大陆,小颜同学探索了许多秘密地区,找到了一个神秘的市场,市场上的物品都是具有特殊属性的稀有元素。市场中的元素价格随时间波动,并且每次购买后价格会有所改变。小颜希望通过这个市场的价格波动来进行元素交易,从而增加他的元素收集。
题目描述
小颜在市场中发现了一种可以用来购买特殊元素的策略:“低价购买,再低价购买”,即每次购买价格必须低于上一次购买的价格。他希望在保持这种策略的前提下,尽可能多地购买元素。
现在,小颜手头有一系列记录了某种元素在连续几天内的价格的数据。你的任务是帮助小颜计算出在这些天里,按照“低价购买,再低价购买”的原则,他最多能购买这种元素多少次。
这里是一个示例的元素价格表:
日期元素价格168269354464568664770867978106211981287
一个优秀的购买策略可以使小颜最多进行4次购买,例如在如下日期和价格进行购买:
日期元素价格2695686641062
输入描述
第一行共一个整数 N (1≤N≤5000),代表记录的天数。
第二行包含 N 个整数,每个整数代表那天的元素价格。所有价格都是不超过 216 的正整数。
输出描述
输出共一行两个整数,分别为最大购买次数和拥有最大购买次数的方案数(数据保证
≤231)。当两种方案价格序列相同时,这两种方案被认为是相同的。
用例输入 1
12 68 69 54 64 68 64 70 67 78 62 98 87
用例输出 1
4 2
上代码:
#include<bits/stdc++.h>
using namespace std;
int a[10005],f[10005],t[10005];
int main(){
int n,a1=1,a2=0;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
f[i]=t[i]=1;
}
for(int i=2;i<=n;i++){
for(int j=1;j<i;j++){
if(a[j]>a[i]){
if(f[i]<f[j]+1)
{
f[i]=f[j]+1;
t[i]=t[j];
}
else if(f[i]==f[j]+1)
t[i]+=t[j];
}
if(a[j]==a[i])
f[j]=t[j]=0;
}
a1=max(a1,f[i]);
}
cout<<a1;
for(int i=1;i<=n;i++)
if(f[i]==a1)
a2+=t[i];
cout<<" "<<a2;
return 0;
}