暑假集训(5)第一弹——— Super Jumping! Jumping! Jumping!(hdu1087)

题意概括:在上次与娑殚的三次博弈中,你们都取得了胜利。便向娑殚提出要求,借助他的力量,传送到一个安全的地方。

你们的愿望达成了,不过,你和小A似乎失散了。

街上人来人往的特别热闹,每一个人的脸上都洋溢着幸福.“咕咕......"额,掏了掏身上的口袋,除你之外。

“听说了嘛,德源街哪有个脑力比赛,据说优胜者可以去”吃到饱“饭店吃到饱,而且前三名还会有神秘奖品......"

这次,为了填饱......嗯,为了生存,你决定参加这个比赛,比赛要求你得到在给定的数字中得到最大循序上升序列和。

问题分析:求得是最大递增子序列和,用递推法,首先i 需要逆序排列,先算出后面的,然后逐步递推。

方程为 打dp[i] = max(dp[i],m[i]+dp[j]);

 1 #include "cstdio"
 2 int m[1000];
 3 int dp[1000];
 4 void mbegin(int n)
 5 {
 6     for (int i=0;i<n;i++)
 7     {
 8         scanf ("%d",&m[i]);
 9         dp[i] = m[i];
10     }
11 }
12 int max(int x,int y)
13 {
14     return x>y?x:y;
15 }
16 int main()
17 {
18     int n;
19     __int64 sum;
20     while (scanf ("%d",&n) && n)
21     {
22         mbegin(n);
23         for (int i=n-1;i>=0;i--)
24          for (int j=i;j<n;j++)
25          {
26             if (m[i] < m[j])
27                dp[i] = max (dp[i],m[i]+dp[j]);
28          }
29         sum = dp[0];
30         for (int i=0;i<n;i++)
31         {
32            if (sum < dp[i])
33                 sum = dp[i];
34         }
35         printf ("%I64d
",sum);
36     }
37 
38     return 0;
39 }
View Code