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 }