暑假集训(5)第一弹——— Super Jumping! Jumping! Jumping!(hdu1087)
2016-08-09 19:17 HUAS_周林微 阅读(132) 评论(1) 编辑 收藏 举报题意概括:在上次与娑殚的三次博弈中,你们都取得了胜利。便向娑殚提出要求,借助他的力量,传送到一个安全的地方。
你们的愿望达成了,不过,你和小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\n",sum); 36 } 37 38 return 0; 39 }