HDU 2372 El Dorado(DP)

HDU 2372

大意:

给你一个长度为n的数列,求极差小于k的最长的上升数列的长度。

思路:

DP,循环k,每次求一个最长上升子序列。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define LL __int64
 4 
 5 int n, m;
 6 int a[110];
 7 LL dp[110][110];
 8 
 9 void Solve()
10 {
11     while(~scanf("%d%d", &n, &m))
12     {
13         memset(dp, 0, sizeof(dp));
14         if(!n && !m)
15         {
16             break;
17         }
18         for(int i = 0; i < n; ++i)
19         {
20             scanf("%d", &a[i]);
21         }
22         for(int i = 0; i < n; ++i)
23         {
24             dp[i][1] = 1;
25         }
26         for(int j = 2; j <= m; ++j)
27         {
28             for(int i = j-1; i < n; ++i)
29             {
30                 for(int k = j-2; k < i; ++k)
31                 {
32                     if(a[i] > a[k])
33                     {
34                         dp[i][j] += dp[k][j-1];
35                     }
36                 }
37             }
38         }
39         LL sum = 0;
40         for(int i = m-1; i < n; ++i)
41         {
42             sum += dp[i][m];
43         }
44         printf("%I64d
", sum);
45     }
46 }
47 
48 int main()
49 {
50     Solve();
51 
52     return 0;
53 }
View Code
原文地址:https://www.cnblogs.com/Silence-AC/p/3641729.html