题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1087
大意:在要走下一步的比上一步数字更大的情况下,使所走过的数字加起来能’最大’。
思路:使用dp数组动态规划,dp[i]中i为第i个棋手,dp[i]为走到第i个棋手时的最大值。
取dp[i]中的最大值即为输出结果。算法思路比较简单详情看代码注解。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define maxn 1000
using namespace std;
int n,dp[maxn],a[maxn];
int main()
{
while(~scanf("%d",&n)&&n!=0)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
memset(dp,0,sizeof(dp));
dp[1]=a[1];//走第一个棋手一定是第一步,dp[1]就是第一个棋手的值
for(int i=2;i<=n;i++)//dp[1]为固定值,从第二个棋手开始循环规划
{
for(int j=1;j<i;j++)
if(a[i]>a[j])//满足下一步比上一步大的条件
dp[i]=max(dp[j]+a[i],dp[i]);
//更新dp[i]数据,dp[j]是走到第j个棋手的最大和,在dp[j]上累加如果比当前dp[i]大则许更换当前值。
//如果不能理解为什么用到dp[j]建议使用样本按照代码走循环即可理解。
else
dp[i]=max(dp[i],a[i]);
}
int Max=0;
for(int i=1;i<=n;i++)
Max=max(Max,dp[i]);
printf("%d\n",Max);
}
return 0;
}