首页 > 代码库 > hdu 1087
hdu 1087
//本题用DP算法: 从一组数据中找一组递增数列且和为最大,假如我们从最后面往前找,每次都要找出前面比本身的小的数 ,
//并加上f[j],就是此时f[j]最大的值
//用f[ ]记下相应的位置的最大和,f[ i ]=max(num[ i ] ,f[ i ]+num[ j ] ),其中0<=j<i且num[ i ]>num[ j ],这样就可以求出从开始到第i
//个元素,递增数列的和的最大值,最存在f[ i ]中;
#include<iostream>
using namespace std;
int num[1000];
int s[1000];
int N;
int main()
{
int i,j,maxSum;
while(scanf("%d",&N)&&N!=0)
{
maxSum=0;
for(i=0;i<N;i++)
scanf("%d",&num[i]); s[0]=num[0];
for(i=1;i<N;i++)
{ s[i]=num[i];
for(j=0;j<=i-1;j++)
if(num[i]>num[j]&&num[i]+s[j]>s[i]) s[i]=num[i]+s[j]; //从num[i]的前面找出比num[i]小的num[j]
if(maxSum<s[i]) maxSum=s[i]; //如果num[i]+s[j]>s[i],则把较大的值赋给s[i];
}
printf("%d\n",maxSum);
}
return 0;
}
//本题用DP算法: 从一组数据中找一组递增数列且和为最大,假如我们从最后面往前找,每次都要找出前面比本身的小的数 ,
//并加上f[j],就是此时f[j]最大的值
//用f[ ]记下相应的位置的最大和,f[ i ]=max(num[ i ] ,f[ i ]+num[ j ] ),其中0<=j<i且num[ i ]>num[ j ],这样就可以求出从开始到第i
//个元素,递增数列的和的最大值,最存在f[ i ]中;
#include<iostream>
using namespace std;
int num[1000];
int f[1000];
int N;
int main()
{
int i,j,maxSum;
while(scanf("%d",&N)&&N!=0)
{
maxSum=0;
for(i=0;i<N;i++)
scanf("%d",&num[i]); f[0]=num[0];
for(i=1;i<N;i++)
{
f[i]=num[i]; //首先f[i]第一步先保存自身的值
for(j=0;j<=i-1;j++)
if(num[i]>num[j]&&num[i]+f[j]>f[i]) //从num[i]的前面找出比num[i]小的num[j]
f[i]=num[i]+f[j];
if(maxSum<f[i]) maxSum=f[i]; //如果num[i]+f[j]>f[i],则把较大的值赋给f[i];
}
printf("%d\n",maxSum);
}
return 0;
}