poj_1952最大下降子序列,统计个数

其实不算难的一道题,但憋了我好久,嗯,很爽。
#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
int n;
int a[5010],dp[5010],s[5010];
void solve()
{
    s[0]=1;
    int maxn=0;
    for(int i=0;i<n;i++)
    {
        dp[i]=1;
        s[i]=1;
        for(int j=0;j<i;j++)
        {
            if(a[j]>a[i])
            {
                int b=dp[i];
                dp[i]=max(dp[i],dp[j]+1);
                if(dp[i]==dp[j]+1&&dp[i]!=b)
                    {if(s[j]==0)
                    s[i]=0;
                    else s[i]=s[j];
                    }
                if(dp[i]==dp[j]+1&&dp[i]==b)
                    {s[i]+=s[j];
                        //cout<<i<<s[i]<<j<<endl;
                    }
            }
            if(a[j]==a[i])
                s[j]=0;
        }
        maxn=max(maxn,dp[i]);
    }
    //for(int i=0;i<n;i++)
        //cout<<dp[i]<<s[i]<<endl;
        int sum=0;
        for(int i=0;i<n;i++)
            if(dp[i]==maxn)
            sum+=s[i];
        cout<<maxn<<" "<<sum<<endl;
}
int main()
{
    while(cin>>n)
    {
        memset(dp,0,sizeof(dp));
        memset(s,0,sizeof(s));
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
            solve();
    }
    return 0;
}

posted @ 2014-05-28 21:16  JarvisLau  阅读(215)  评论(0编辑  收藏  举报