1. 程式人生 > >求最長不下降序列個數

求最長不下降序列個數

turn %d span scanf namespace can 必須 ostream color

求最長不下降序列個數(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必須初始化

求最長不下降序列個數