求最長不下降序列個數
阿新 • • 發佈:2017-11-25
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 intans[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必須初始化
求最長不下降序列個數