您的位置:首页 > 其它

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

2011-04-18 16:25 537 查看
这是一道简单的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: