求最长不下降序列个数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求最长不下降序列个数相关的知识,希望对你有一定的参考价值。
求最长不下降序列个数(jdoj-1946)
题目大意:给你一个序列,求所有最长不下降序列的个数。
注释:n(总序列长度)<10000。
想法:维护两个数组,分别表示包含这个数的最长子序列长度和达到这个长度的方案数,最后统计答案,跑两次dp即可。
最后,附上丑陋的代码.......
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 int dp[10010]; 5 int a[10010]; 6 int sum[10010]; 7 int ans[10010]; 8 int main() 9 { 10 int n; 11 scanf("%d",&n); 12 for(int i=1;i<=n;i++) 13 { 14 dp[i]=1; 15 scanf("%d",&a[i]); 16 for(int j=1;j<=i-1;j++) 17 { 18 if(a[j]<=a[i]) dp[i]=max(dp[i],dp[j]+1); 19 } 20 } 21 int x=1; 22 for(int i=1;i<=n;i++) if(dp[i]>dp[x]) x=i; printf("%d\n",dp[x]); 23 for(int i=1;i<=n;i++) 24 { 25 if(dp[i]==1) ans[i]=1; 26 else 27 { 28 for(int j=1;j<=i-1;j++) 29 { 30 if(a[j]<=a[i]&&dp[j]+1==dp[i]) ans[i]+=ans[j]; 31 } 32 } 33 } 34 int ansans=0; 35 for(int i=1;i<=n;i++) 36 { 37 if(dp[i]==dp[x]) ansans+=ans[i]; 38 } 39 printf("%d\n",ansans); 40 return 0; 41 }
小结:错误。
两次dp必须初始化
以上是关于求最长不下降序列个数的主要内容,如果未能解决你的问题,请参考以下文章