求最长不下降序列个数

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必须初始化

 

以上是关于求最长不下降序列个数的主要内容,如果未能解决你的问题,请参考以下文章

计蒜客 最长不下降子序列 (贪心+二分nlogn算法)

单调栈最长不下降子序列变式

最长不下降子序列

poj 1065 wooden sticks

「模板」最长不下降子序列 LIS

DP简单问题联系--最长递增子序列+最长公共子序列等