[POJ1952]BUY LOW, BUY LOWER
题目描述 Description |
The advice to "buy low" is half the formula to success in the bovine stock market.To be considered a great investor you must also follow this problems' advice: "Buy low; buy lower"
Day 1 2 3 4 5 6 7 8 9 10 11 12
Day 2 5 6 10 |
输入描述 Input Description |
* Line 1: N (1 <= N <= 5000), the number of days for which stock prices are given * Lines 2..etc: A series of N space-separated integers, ten per line except the final line which might have fewer integers. |
输出描述 Output Description |
Two integers on a single line: |
样例输入 Sample Input |
12 68 69 54 64 68 64 70 67 78 62 98 87 |
样例输出 Sample Output |
4 2 |
数据范围及提示 Data Size & Hint |
之前的一些废话:近日诸事不顺。
题解:对于第一问我们xjb做一遍最长下降子序列即可,对于方案数,在转移的时候顺便计算一下,注意如果发现a[i]=a[j],就要把cnt[i]标记成0,来做到去重。
代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #include<set> #include<queue> using namespace std; typedef long long LL; typedef pair<int,int> PII; #define mem(a,b) memset(a,b,sizeof(a)) inline int read() { int x=0,f=1;char c=getchar(); while(!isdigit(c)){if(c=='-')f=-1;c=getchar();} while(isdigit(c)){x=x*10+c-'0';c=getchar();} return x*f; } const int maxn=5010; int n,a[maxn],dp[maxn],ans,cnt,dp2[maxn]; int main() { n=read(); for(int i=1;i<=n;i++)a[i]=read(),dp[i]=dp2[i]=1; for(int i=2;i<=n;i++) for(int j=1;j<i;j++) { if(a[i]<a[j]) { if(dp[j]+1>dp[i])dp[i]=dp[j]+1,dp2[i]=dp2[j]; else if(dp[j]+1==dp[i])dp2[i]+=dp2[j]; } else if(a[i]==a[j])dp2[i]=0; } for(int i=1;i<=n;i++)ans=max(ans,dp[i]); for(int i=1;i<=n;i++)if(ans==dp[i])cnt+=dp2[i]; printf("%d %d\n",ans,cnt); return 0; }
总结: