LeeBlog

导航

HDU 1087 Super Jumping! Jumping! Jumping! 简单DP

这是一道简单的DP,应该从前面往后面找,结果我一开始用递归,从后面往前面找,悲剧了很久

这里的思想是先从第一个开始找到第一个的最优解,然后第二个,第三个。。。。而为什么要一个一个来求呢,那是因为后面的都是通过前面的来找最优解(dis[j] > max && num[j] < num[i] ),最后把全部的最优解都找到,而本题求的是全题的最优解,所以还要找到全局的最优解( Max )。

#include<stdio.h>
#include
<string.h>
int n,num[10000],dis[10000];
int cal( )
{
int Max = 0;
for( int i = 1; i <= n;++i )
{
int max = 0,pos = 0;
for( int j = 0; j <= i; ++j )//找前面已经存在且符合条件的最优解
if( dis[j] > max && num[j] < num[i] )
max
= dis[j];
dis[i]
+= num[i] + max;//找到后把本身加进去
if( dis[i] > Max )
Max
= dis[i];
}
return Max;
}
int main( )
{
while( scanf( "%d",&n ),n )
{
num[
0] = 0;
memset( dis,
0,sizeof( dis ) );
for( int i = 1; i <= n; ++i )
scanf(
"%d",&num[i] );
printf(
"%d\n",cal( ) );
}
return 0;
}

posted on 2011-04-18 16:25  LeeBlog  阅读(174)  评论(0编辑  收藏  举报