开始一直超时,后来发现第二层for循环写错了,下标是j--,结果写成i--了,硬是没看出来。
这一题求的最长递减子序列,算是个dp的问题。但是有个陷阱,就是可能有相同的数字
比如数字序列 8 7 6 7 5,最长的递减子序列为(8,7,5),(8,7,6),比如(8,7,5)出现了两次只能算一次,不能重复计算
可以通过如下语句排除相同的序列
else if(arr[i]==arr[j]){
if(len[i]==1)
num[i]=0;
break;
}
另外第二层循环后j从i-1开始递减,这样距离最近的相同的数字如果相同的话便不用比较了
#include<iostream>
using namespace std;
int lds(int *arr,int size,int &res){
int max_len=1;
int *len=new int[size];
int *num=new int[size];
res=0;
for(int i=0;i<size;i++){
len[i]=num[i]=1;
for(int j=i-1;j>=0;j--){
if(arr[i]<arr[j]){
if(len[i]<len[j]+1){
len[i]=len[j]+1;
num[i]=num[j];
}
else if(len[i]==len[j]+1){
num[i]+=num[j];
}
}
else if(arr[i]==arr[j]){
if(len[i]==1)
num[i]=0;
break;
}
}
if(max_len<len[i])
max_len=len[i];
}
for(int i=0;i<size;i++){
if(len[i]==max_len)
res+=num[i];
}
delete []len;
delete []num;
return max_len;
}
int main(){
int res;
int N;
cin>>N;
int *arr=new int[N];
for(int i=0;i<N;i++)
cin>>arr[i];
int num;
res=lds(arr,N,num);
cout<<res<<" "<<num<<endl;
delete []arr;
return 0;
}