POJ2593MaxSequence(动态规划)
来源:优易学  2011-12-9 21:07:47   【优易学:中国教育考试门户网】   资料下载   IT书店
  好好想了一下,觉得不能再这样到处做题了,必须得有个方向,有目的的做。否则就算做得再多,结果也不一定就如人意。在网上仔细找了一下,学习了别人的经验,决定把一些常见的问题搞懂再说,然后找了一些各个OJ上比较有代表性的各个方面、各种算法的题目,争取尽自己的努力一个一个把它们击破。另外,写好解题报告,既是对知识的一种熟练,也是一种巩固。
  POJ 2593 Max Sequence
  考察点:动态规划
  思路:虽然题目给出了3000ms的时间,但考虑到数据量可以达到100000,如果用O(N^2)的算法的话,还是极有可能会超时的,于是决定采用这种O(N)时间效率的动规。在输入的同时,进行一次DP,计算出从左到右的最大值,并把它保存在数组dp的对应的下标元素中,这样之后,对于下标为i 的元素,它其中保存的便是前面所有元素可能的最大连续和。再从右到左进行一次DP,计算从右到左的最大连续和。假设此时已经算到下标为i的元素,那么将 sum+dp[i-1]与ans进行比较,将ans取较大者。
  提交情况:Accepted 1次
  收获:对这种比较明显的DP问题有了弄深的理解,同时也对时间效率这个概念有了点印象。www.Examda.CoM考试就到考试大
  AC Code
  #include <iostream>
  using namespace std;
  int data[100000], dp[100000];
  int main()
  {
  int n;
  while(cin>>n){
  if(!n)
  break;
  int sum = 0, tmp = -999999999;
  for(int i = 0; i < n; i++){
  scanf("%d", &data[i]);
  sum += data[i];
  if(sum > tmp)
  tmp = sum;
  dp[i] = tmp;
  if(sum < 0)
  sum = 0;
  }
  sum = 0;
  int ans = -999999999;
  for(int i = n-1; i > 0; i--){
  sum += data[i];
  if(dp[i-1]+sum > ans)
  ans = dp[i-1]+sum;
  if(sum < 0)
  sum = 0;
  }
  cout<<ans<<endl;
  }
  return 0;
  }

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训