http://poj.org/problem?id=1952
dp题目,求最长递减子序列的长度以及该长度的子序列有几个,且元素全部相同视为该子序列相同。 需要两个数组dp[i]表示以a[i]为结尾的子序列长度为多少 状态转移为dp[i]=max(dp[j])+1,j<i且a[i]<a[j],,,count[i]数组表示以a[i]为结尾的递减子序列的个数,状态转移为count[i]=sum(coun[j])(a[i]<a[j]&&dp[j]+1==dp[i]&&j<i)
#include<iostream>
#include<cstdio>
using namespace std;
const int N=5005;
int dp[N],a[N],count[N];
int main()
{
bool mark;
int n,i,j,k,max;
while(scanf("%d",&n)!=EOF){
for(i=0;i<n;i++)
scanf("%d",&a[i]);
a[n]=-1;
for(i=0;i<=n;i++){
max=0;
for(j=i-1;j>=0;j--){
if(a[i]<a[j]&&dp[j]>max)max=dp[j];
}
dp[i]=max+1;
}
for(i=0;i<=n;i++){
if(dp[i]==1){count[i]=1;continue;}
else count[i]=0;
for(j=i-1;j>=0;j--){
if(a[j]>a[i]&&dp[j]==dp[i]-1){
mark=true;
for(k=j+1;k<i;k++){
if(a[k]==a[j]){
mark=false;
break;
}
}
if(mark)count[i]+=count[j];
}
}
}
printf("%d %d\n",dp[n]-1,count[n]);
}
return 0;
}