Super Jumping! Jumping! Jumping! HDU 1087

http://acm.hdu.edu.cn/showproblem.php?pid=1087

 

解题思路:

既然我们要找跳跃能得到的最大值,那么我们可以建立一个数组opt[n],来记录到达第a[i]项的最优解。

因为设置i总比j大,所以这里maxl是取不到opt[0]的,因此我们将maxl的值初始化为a[0]。

于是对于遍历的每一项a[i],我们考虑怎样跳跃在i前小于a[i]的格子来让到达a[i]时能够有最大值。当遍历到一个a[j]<a[i]时,我们比较opt[j]+a[i]与opt[i]的值,将最大的那个放入opt[i],那么我们通过从0~i-1一定能够得到从0到a[i]跳跃能够得到的最大价值。而当i前并没有大于a[i]的值时,opt[i]=a[i]。所以就在读取数组元素时直接初始化opt数组。

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 
 6 #define N 100010
 7 
 8 using namespace std;
 9 
10 typedef long long int ll;
11 
12 int main()
13 {
14     int n;
15     int a[1010], opt[1010];
16     while(scanf("%d", &n), n){
17         int i, j, maxl;
18         for(i=0; i<n; i++){
19             scanf("%d", &a[i]);
20             opt[i]=a[i];
21         }
22         maxl=opt[0];
23         for(i=0; i<n; i++){
24             for(j=0; j<i; j++){
25                 if(a[j]<a[i]){
26                     opt[i]=max(opt[j]+a[i], opt[i]);
27                     maxl=max(maxl, opt[i]);
28                 }
29             }
30         }
31         printf("%d\n", maxl);
32     }
33     return 0;
34 }
原文地址:https://www.cnblogs.com/Arrokoth/p/12013726.html