题目:
分析:
按照基础方法来做吧。
经典问题的改进:注意要统计最长出现的个数
A【i】表示i位置的最大值。
代码:
vector<int> n;
int A[n.size()];
A[0]=1;
for(int i=1;i<n.size();i++)
{
A[i]=1;
for(int j=0;j<i;j++)
{
if(n[i]>n[j]) A[i]=max(A[i],A[j]+1);
}
}
//找最大值
int maxx=1;
for(int i=0;i<n.size();i++)
{
maxx=max(A[i],maxx);
}
如何统计:
统计达到最大值的个数?不对。
应该再借助一个数组。在比较时就进行数据的统计。
代码:
int A[n.size()];
int B[n.size()];
A[0]=1;
for(int i=0;i<n.size();i++) B[i]=1;
for(int i=1;i<n.size();i++)
{
A[i]=1;
for(int j=0;j<i;j++)
{
if(n[i]>n[j]) A[i]=max(A[i],A[j]+1);
}
//A[i]的值已经确定,进行B【i】值的确定。
if(A[i]==1) continue;
B[i]=0;
for(int j=0;j<i;j++)
{
if(A[i]-1==A[j]&&n[i]>n[j]) B[i]++;
}
}
//找最大值
int maxx=1;
for(int i=0;i<n.size();i++)
{
maxx=max(A[i],maxx);
}
//统计个数
int c=0;
for(int i=0;i<n.size();i++)
{
if(maxx==A[i]) c=c+B[i];
}
for(int i=0;i<n.size();i++)
{
cout<<A[i]<<" "<<B[i]<<endl;
}
return c;
因为B记录的是到达最值的个数。也只需要用每个位置到达最大值的个数。
其他思路:
自己又想到这样处理A数组。倒着找maxx-1,记录第一个出现的位置end,每次找到更新该处的值,很棒的思路哦,完全可行。