杭电1087

题意:求递增子序列的和的最大值。

Analyse:一开始想到的居然是把每个格子的加或不加都计算一次然后放在数组里面,再想一下发觉这就是暴力了。之后还是想到了动态规划的方法,因为a[n]能不能加进去只跟之前的子序列最后一个元素的大小有关,所以如果a[n]能加进去某个子序列里面的话,只需要用到这个子序列的最优解(而不需要其他情况的),而且要使a[n]为尾的子序列的和最大,要选一个之前的最大的子序列。因此递推式为dp[n]=max{dp[i],i=0,1,2......n-1}+a[n]或dp[n]=a[n]。

View Code
 1 #include<iostream>
 2 using namespace std;
 3 int a[1000];
 4 int dp[1000];
 5 int main()
 6 {
 7     int n,i,j,max;
 8     while(cin>>n && n)
 9     {
10         for(i=0;i<n;i++)
11             cin>>a[i];
12         for(i=0;i<n;i++)
13         {
14             for(max=0,j=0;j<i;j++)
15             {
16                 if(a[j]<a[i] && max<dp[j])
17                     max=dp[j];
18             }
19             dp[i]=max+a[i];
20         }
21         max=dp[0];
22         for(i=1;i<n;i++)
23         {
24             if(max<dp[i])
25                 max=dp[i];
26         }
27         cout<<max<<endl;
28     }
29     return 0;
30 }
posted @ 2012-08-21 19:44  Hogg  阅读(600)  评论(0编辑  收藏  举报