HDU 2372 El Dorado(DP)

本文介绍了解决HDU2372问题的方法,该问题是寻找一个给定数列中极差小于k的最长上升子序列。通过动态规划算法,循环遍历不同的极差限制来找出符合条件的最长子序列。

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\n", 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值