HDU 1087

  一道简单的动态规划。

  这道题要求的是最长上升子序列的和。用一个sum数组存储子问题的解。(sum对应的下标 i 表示,从0到i,最长上升子序列的和。)从头开始,遍历每一个数,开始第一重循环。对每一个数,又从头遍历到这个数的前一个数,这是第二重循环,在第二重循环中,用下标j表示当前遍历到的数,如果data[i]>data[j],则说明data[j]和data[i]能构成一个上升子序列,但此时还需继续往后遍历(因为要求最长),用tem保存最大的sum[j](到第j个数时的解,最大的sum[j]才能保证最长子序列)。遍历完后,将此时的sum[i]更新(sum[i]+=data[i]+tem),解决了当前的子问题。

  另外,第二重循环的遍历似乎从后往前更适合一些。

#include<stdio.h>
#include<string.h>
#define N 1010
int main()
{
int n;
while(scanf("%d",&n)==1&&n!=0)
{
int i,data[N],sum[N],j,max=0;
for(i=0;i<n;i++)
scanf("%d",&data[i]);
memset(sum,0,sizeof(sum));
for(i=0;i<n;i++)
{
int tem=0;
for(j=0;j<i;j++)
{
if(data[i]>data[j])
{
if(tem<sum[j])
tem=sum[j];
}
}
sum[i]+=data[i]+tem;
if(max<sum[i])
max=sum[i];
}
printf("%d\n",max);
}
return 0;
}



posted @ 2012-04-07 18:56  等待电子的砹  阅读(1654)  评论(0)    收藏  举报