poj1952

来源:互联网 发布:域名 服务器 知乎 编辑:程序博客网 时间:2024/05/18 09:06

开始一直超时,后来发现第二层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;}


原创粉丝点击