您的位置:首页 > 其它

poj 1952 最长不下降子序列加最长串数

2010-04-14 21:32 405 查看
#include <iostream>
#include <limits.h>
using namespace std;
#define inf INT_MAX;
int data[5003];
int dp[5003];
int count[5003];
int minNow=0;

void lds(int n){
memset(dp,0,sizeof(dp));
minNow=0;
memset(count,0,sizeof(count));
count[0]=1;
int t;
for(int i=1;i<=n;i++)
{
dp[i]=1;
t=-1;
for(int j=i-1;j>=0;j--)
{
if(data[i] < data[j])
{
if(dp[j]+1==dp[i]&&data[j]!=t)//dp保证前面的子序列是有序的,如果有相同的,由t排除,如果不同的,两个的dp值肯定不同
{//所以不会出现count加了不应该加的东西,exp:6 7 6 7 6 4
count[i]+=count[j];
t=data[j];//同理,不可能出现data【j】之前相同的元素,所以直接可以赋值给下一个

}
else
if(dp[j]+1>dp[i])
{
dp[i]=dp[j]+1;
count[i]=count[j];
t=data[j];
}
}
}
}
int out=0;
for(int i=0;i<n;i++)
out=max(out,dp[i]);
cout<<out<<" ";
cout<<count
<<endl;

};
int main()
{
int n;
cin>>n;
{
for(int i=1;i<=n;i++)
scanf("%d",&data[i]);
data[0]=1<<30;
lds(n+1);

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: