hdu 1087 Super Jumping! Jumping! Jumping!
hdu 1087 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1087
动态规划题
/************************************************************************/
/*双重循环,里面一重求得每一个位置i时最优解。就比如i从0到n,先求出0位置的最优解是其本身,再求出1位置的最优解(即判断是其本身大还是从0跳到1所得解大,取其大)。再求2位置的最优解(即判断shiite其本身大还是从0跳到2所得解答,还是从1跳到2所得解大(即1的最优解基础上加上2所得解),取其大)。。。。
/************************************************************************/
#include <stdio.h>
int num[1010],dp[1010];
int main()
{
int n,max,i;
while (scanf("%d",&n),n)
{
for (i=0;i<n;i++){
scanf("%d",&num[i]);
dp[i]=num[i];
}
max=0;
for (i=0;i<n;i++)
{
for (j=0;j<i;j++)
if(num[i]>num[j]&&dp[i]<dp[j]+num[i])//若当前结点大于第j个结点,且当前的最优解dp[i]小于第j个位置的结点-跳到->当前结点i所得解,则当前最优解变为dp[j]+num[i]
dp[i]=dp[j]+num[i];//在dp的每个元素在从dp[0]到dp[n]的循环中,一步步均变为到达本身位置的最优解
if(max<dp[i])
max=dp[i];
}
printf("%d\n",max);
}
}