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; }