先声明一下下述的变量
N为总天数,
A[i]表示第i个数字,
f[i]和g[i]的定义见下文
Max=max(f[i])1<=i<=N
第一问就是个最简单的最长下降序列,f[i]表示当前包含第i个数字的最长下降序列,
第二问稍复杂,我的分析:
我的代码(因为答案可能很大,所以用了高精度,并重载了"+"运算
#include <fstream>
#include <memory.h>
using namespace std;
ifstream fin("buylow.in");
ofstream fout("buylow.out");
const long long Mx=6000,Base=10;
class BigNumber
{
public:
int List[100],Ln;
BigNumber()
{
memset(List,0,sizeof(List));
Ln++;
}
void maintain()
{
for(int i=1;i<=Ln;i++)
{
List[i+1]+=List[i]/Base;
List[i]%=Base;
}
while(List[Ln+1]!=0)
{
List[Ln+1]+=List[Ln]/Base;
List[Ln]%=Base;
Ln++;
}
}
BigNumber operator +(const BigNumber p)const
{
int Len=max(Ln,p.Ln);
BigNumber ans=*this;
for(int i=1;i<=Len;i++)
ans.List[i]+=p.List[i];
ans.Ln=Len;
ans.maintain();
return ans;
}
BigNumber operator -(const int p)const
{
BigNumber ans=*this;int i;
ans.List[1]-=p;
while(ans.List[i]<0)
{
ans.List[i]+=10;
ans.List[i+1]-=1;
}
return ans;
}
void Out()
{
for(int i=Ln;i>=1;i--)
fout<<List[i];
fout<<endl;
}
}Mp,g[Mx];
long long N,A[Mx],f[Mx],Max;
int main()
{
long long i,j;
fin>>N;
for(i=1;i<=N;i++)
{
fin>>A[i];
f[i]=1;
g[i].List[1]=1;
}
for(i=1;i<=N;i++)
{
for(j=i-1;j>=1;j--)
if(A[i]<A[j])
{
if(f[j]+1>f[i])
f[i]=f[j]+1,g[i]=g[j];
else
if(f[j]+1==f[i])
g[i]=g[i]+g[j];
}
else
if(A[i]==A[j])
{
A[j]=-1;
f[j]=-1;
}
if(Max<f[i])
Max=f[i];
}
for(i=Max;i<=N;i++)
if(f[i]==Max)
Mp=Mp+g[i];
fout<<Max<<" ";
Mp.Out();
fin.close();
fout.close();
return 0;
}
2024年2月22日 19:52
We need many stories, Like genuinely appreciated, You want addiitional data over it, mainly because it can be reasonably exceptional., Take care exclusively for declaring